PHP/MYSQL 查询被另一个数组分组

我今天的需要,我希望你能找到很好的解决方案,如下所示。我有一个包含任务的数据库表,每个任务的状态为“打开”或“关闭”。就我而言,我只有带有未完成任务的记录。


我需要构建一个数组,显示所有状态选项(打开、关闭),并在每个状态选项中显示打开或关闭的任务(如果存在)。输出应该是:


Array (

  [open] => Attay(task1), Array(task2),..

  [closed] => Array()  

)

如果我进行 sql 查询:


select task_id,status from tasks group by status

我只得到“打开”中的任务。哪个是构建状态数组并在每个任务中“附加”具有该状态的任务的最佳方法?


提前致谢!


梵蒂冈之花
浏览 124回答 4
4回答

拉莫斯之舞

你可以尝试这样的事情$sql = "SELECT task_id, status FROM tasks";$status['open'], status['close'] = [];while( $row = $result->fetch_assoc() ) {    if ($row['status'] == 'open') {        array_push($status['open'], $row['task_id']);    }    if ($row['status'] == 'close') {        array_push($status['close'], $row['task_id']);    }}print_r($status);

弑天下

您可以使用GROUP_CONCAT将每个状态的所有任务收集到逗号分隔列表中,然后将explode其收集到 PHP 中的数组中。假设您正在使用mysqli并且您的连接在 中$conn,您将执行如下操作:$sql = "SELECT status, GROUP_CONCAT(task_id) AS taskids FROM tasks GROUP BY status";$result = $conn->query($sql);$output = array();while ($row = $result->fetch_assoc()) {    $output[$row['status']] = explode(',', $row['taskids']);}

PIPIONE

这样解决的。  $statusArray = ['opened', 'wait_others', 'wait_us', 'closed'];  foreach ($statusArray as $status) {    $ticketsArray[$status]= array();  }  foreach ($row as $key => $value) {    $ticketsArray[$value->status_title][$value->ticket_id]= $row[$key];  }  print"<pre>";print_r($ticketsArray);

德玛西亚99

在纯 SQL 中,您可以使用 生成派生的状态表union all,然后将原始表带入left join:select&nbsp; &nbsp; s.status,&nbsp; &nbsp; json_arrayagg(t.task_id) json_task_idsfrom (&nbsp; &nbsp; select 'open' status&nbsp; &nbsp; union all select 'closed' status) sleft join tasks t on t.status = s.statusgroup by s.statusMySQL 没有array数据类型,因此这会将任务 ID 列表作为 json 数组。另一种选择是构建逗号分隔列表:为此,您可以使用group_concat():select&nbsp; &nbsp; s.status,&nbsp; &nbsp; group_concat(t.task_id) csv_task_idsfrom (&nbsp; &nbsp; select 'open' status&nbsp; &nbsp; union all select 'closed' status) sleft join tasks t on t.status = s.statusgroup by s.status
打开App,查看更多内容
随时随地看视频慕课网APP