当您只需要计算某些项目时,按计数排序

时间:2011-01-27 12:13:24

标签: sql mysql

我有这个问题:

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

的记录

我可以将此查询设置为不同,并从计数中丢失案例内容吗?

3 个答案:

答案 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