目标是考虑到每个任务的状态,在任务列表上取得进度,排除无效任务。
目前,我设法在性能上付出了非常昂贵的代价,并且想知道是否有可能在一个SQL语句中达到相同的结果,或者至少找到一种更优化的方法。
SELECT COUNT(`id`) AS `status` FROM `task` WHERE `status` = 'done'
UNION
SELECT COUNT(`id`) AS `status` FROM `task` WHERE `status` = 'pending';
上面的查询结果分为2行,我可以将它们加起来得出5个正确的总数,第一行是已完成任务的数量:从那里很容易完成3/5或 60%完成
status
------
3
2
我知道这个示例非常具体,我尝试了此查询,但是遇到了一些问题。关于分组?还是我完全错了?
SELECT
COUNT(CASE WHEN `status` = 'done' THEN 1 ELSE 0 END) AS `done`,
COUNT(CASE WHEN `status` = 'pending' THEN 1 ELSE 0 END) AS `pending`
FROM `task`
GROUP BY `status`;
上面的查询导致2列和3行重复:
done pending
---------------
3 3
1 1
2 2
在此示例表中,我查看的是5个有效任务中的3个或60%已完成。
name status
------------------
task 1 done
task 2 done
task 3 pending
task 4 done
task 5 invalid
task 6 pending
感谢您的帮助!
答案 0 :(得分:1)
您还使用else 0
来统计错误情况。如果比较结果为null
,则将其默认设置为false
,并且不计算在内。
SELECT
COUNT(CASE WHEN `status` = 'done' THEN 1 END) AS `done`,
COUNT(CASE WHEN `status` = 'pending' THEN 1 END) AS `pending`
FROM `task`
WHERE `status` in ('done','pending')
或者可以简化为
SELECT
SUM(`status` = 'done') AS `done`,
SUM(`status` = 'pending') AS `pending`
FROM `task`
WHERE `status` in ('done','pending')