我有这个问题:
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
如您所见,我使用左连接,我只计算Active
我可以将此查询设置为不同,并从计数中丢失案例内容吗?
答案 0 :(得分:2)
如果您想要返回所有提示,无论状态如何,并按活动记录的数量排序,那么这就像您将获得的一样漂亮。
如果您只想返回有效提示,则可以添加Where status = 'Active'
,然后按Count(t.id)desc排序。
另一种方法是在提示表中有一个NumActive int列,只要为给定提示添加或修改新的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
虽然这为子查询交换了一个案例,但只是以不同的方式复杂化。
答案 1 :(得分:1)
快速注意,你不能在t.id上选择t。*和group。所以说:
SELECT t.id,coalesce(tu.cntUsed,0) as cntUsed
FROM `tips` `t`
LEFT
JOIN (Select tip_id,count(*) as cntUsed
from tip_usage
WHERE status='Active'
group by tip_id
) tu
ON t.id = tu.tip_id
ORDER coalesce(tu.cntUsed,0)
由于您希望左连接并包含没有用法的提示,因此至少将它们全部排在顶部,值为零,这是表中实际情况的最准确陈述。
答案 2 :(得分:-1)
SELECT tips.*, COUNT(*) AS number
FROM tip_usage
LEFT JOIN tips ON tips.id = tip_id
WHERE STATUS = "Active"
GROUP BY tip_id
ORDER BY number DESC