为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
梵蒂冈之花 2023-04-21 10:01:48
我今天的需要,我希望你能找到很好的解决方案,如下所示。我有一个包含任务的数据库表,每个任务的状态为“打开”或“关闭”。就我而言,我只有带有未完成任务的记录。我需要构建一个数组,显示所有状态选项(打开、关闭),并在每个状态选项中显示打开或关闭的任务(如果存在)。输出应该是:Array (  [open] => Attay(task1), Array(task2),..  [closed] => Array()  )如果我进行 sql 查询:select task_id,status from tasks group by status我只得到“打开”中的任务。哪个是构建状态数组并在每个任务中“附加”具有该状态的任务的最佳方法?提前致谢!
查看完整描述

4 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

你可以尝试这样的事情


$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);


查看完整回答
反对 回复 2023-04-21
?
弑天下

TA贡献1818条经验 获得超8个赞

您可以使用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']);

}


查看完整回答
反对 回复 2023-04-21
?
PIPIONE

TA贡献1829条经验 获得超9个赞

这样解决的。


  $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);


查看完整回答
反对 回复 2023-04-21
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

在纯 SQL 中,您可以使用 生成派生的状态表union all,然后将原始表带入left join:


select

    s.status,

    json_arrayagg(t.task_id) json_task_ids

from (

    select 'open' status

    union all select 'closed' status

) s

left join tasks t on t.status = s.status

group by s.status

MySQL 没有array数据类型,因此这会将任务 ID 列表作为 json 数组。另一种选择是构建逗号分隔列表:为此,您可以使用group_concat():


select

    s.status,

    group_concat(t.task_id) csv_task_ids

from (

    select 'open' status

    union all select 'closed' status

) s

left join tasks t on t.status = s.status

group by s.status


查看完整回答
反对 回复 2023-04-21
  • 4 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信