2011-01-27 27 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