我有这个查询:
SELECT tips.*
FROM `tips` `t`
LEFT JOIN tip_usage
ON tip_usage.tip_id = t.id
GROUP BY t.id
ORDER BY COUNT(CASE
WHEN status = 'Active' THEN status
ELSE NULL
END) DESC
正如您在此处看到的,我使用左联接,并且仅计算事件
的记录
我可以使这个查询变得不同,并从计数中丢失案例内容吗?
最佳答案
如果您想返回所有提示,无论状态如何,但按事件记录数排序,那么这就是您将获得的结果。
如果您只想返回事件提示,则可以添加 Where status = 'Active'
,然后只需按 Count(t.id) desc 进行排序。
一种替代方法是,您在 Tips 表中有一个 NumActive int 列,并且每当为给定 Tip 添加或修改新的tip_usage 记录时,您都会保留此更新。这会给tip_usage的插入/删除/更新操作带来更多开销,但会使这个查询变得更简单:
select *
from tips
Order by tips.NumActive desc
另一种选择是:
Select tips.*
From tips
Order by (
Select count(tip_id)
From tips_usage as t
Where t.tip_id = tips.id and status = 'Active') DESC
尽管这将大小写交换为子查询,但只是以不同的方式复杂。
关于sql - 当您只需要计算某些项目时,按数量排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4816139/