我今天的需求,希望您能找到很好的解决方案,以下是。我有一个包含任务的数据库表,每个任务的状态为“打开”或“关闭”。就我而言,我只有具有未完成任务的记录。
我需要建立一个显示所有状态选项(打开,关闭)的数组,并在每个选项内部显示打开或关闭的任务(如果存在)。输出应为:
Array (
[open] => Attay(task1), Array(task2),..
[closed] => Array()
)
如果我进行sql查询:
select task_id,status from tasks group by 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']);
}
在纯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