2013-04-05 136 views
2

我有兩個表:邀請和事件。我需要做一個子查詢

我需要獲取事件的名稱,每個事件的客人總數和呈現的總數,當其每個事件在同一個查詢中爲真時!

喜歡的東西加入兩個表(左連接)選擇events.name,計數(invitations.guest),計數(invitations.presents時= TRUE)和事件組吧...

展望表中的數據...

https://dl.dropbox.com/u/360112/Duda/invitaciones.jpg https://dl.dropbox.com/u/360112/Duda/eventos.jpg

我認爲它可以工作,但我沒有得到我想要的東西......

SELECT e.name, count(in.guest) as Guests, (SELECT count(presents) 
FROM watermelon.invitations WHERE presents = true) as Presents 
FROM watermelon.events e LEFT JOIN watermelon.invitations in ON e.id = in.event 
GROUP BY in.event; 

然後我得到:

http://dl.dropbox.com/u/360112/Duda/resultado.jpg

一些建議嗎?請我需要它,我厭倦了嘗試和得到錯誤的結果... 在此先感謝!

+0

請格式化的問題更好的下一次。 :)此外,您的投遞箱的鏈接已損壞。 – Jess 2013-04-05 03:27:38

+1

哦!下次我會知道的! – Jamr 2013-04-05 04:24:39

回答

2

聽起來像是你想要的東西,這樣的使用COUNTGROUP BYCASE

SELECT E.Id, 
    E.Name, 
    COUNT(I.Id) TotalGuests, 
    COUNT(CASE WHEN I.Presents = 'TRUE' THEN 1 END) TotalPresents 
FROM Events E 
    LEFT JOIN Invitations I ON E.Id = I.Event 
GROUP BY E.Id, E.Name 

我不看好禮物的數據類型,但是這應該是接近。還使用LEFT JOIN返回所有事件。

+0

謝謝。它完美的工作!請問,你能告訴我在哪裏可以找到關於在查詢中使用的方法和關鍵字的更多信息? – Jamr 2013-04-05 04:21:00

+1

@Jamr - np,很高興我們能幫上忙! CASE語句與IF語句非常相似 - 如果Presents ='True'則對該記錄進行計數,否則不要(實際上返回null,如果您嘗試計數爲null,則計爲0)。您可以將多個WHEN語句串聯在一起(否則如果),這可以實現更好的比較。最好的祝福。 – sgeddes 2013-04-05 04:27:26

1

的問題是,你的子查詢
(SELECT count(presents) FROM watermelon.invitations WHERE presents = true)
沒有做任何過濾;它只是在每次被調用時計算表中的所有記錄。以下查詢應按照您的需要進行。這是你有,只是我添加了「和subq.event = e.id」的標準,這限制了子查詢的數據僅爲特定記錄完全相同的查詢:
SELECT e.name, count(in.guest) as Guests, (SELECT count(subq.presents) FROM watermelon.invitations as subq WHERE subq.presents = true and subq.event=e.id) as Presents FROM watermelon.events e LEFT JOIN watermelon.invitations in ON e.id = in.event GROUP BY in.event;