2011-01-27 31 views
0

我有这个疑问:为了通过计数时,你必须只计算某些项目

​​

正如你看到这里,我用左连接,我只算这是记录Active

灿我让这个查询有所不同,并从计数中丢失案件?

+0

`... WHERE status ='Active'`? – knittl 2011-01-27 12:15:55

+0

列“状态”属于哪个表? – 2011-01-27 12:16:54

回答

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

快速注意,您不能选择t。*和t.id组。所以,他这样说:

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) 

既然你要离开,加盟,包括一些没有使用的提示,这至少对它们进行分类全部为零的价值,这是最准确的说法顶部的现实是什么在表中。

-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