2014-01-21 65 views
0

我只想連接返回0而不是刪除行。目前,如果我嘗試加入兩個表和統計項目爲每個訂閱的數量,這將很好地工作:Postgres左連接正在截斷行

SELECT S.id, count(I.id) FROM "Subscription" S 
LEFT JOIN "Item" I on I.id = S.item_id 
WHERE S.status = 1 
GROUP BY S.id 

回報:

id | count(I.id) 
1  4 
2  3 
3  2 

而:

SELECT S.id, count(I.id) FROM "Subscription" S 
LEFT JOIN "Item" I on I.id = S.item_id 
WHERE S.status = 1 
AND I.status IN (1,2,3) 
GROUP BY S.id 

退貨:

id | count(I.id) 
1  3 

我意識到這可能是Postgres應該如何工作的,但我曾經習慣使用MySQL。

我已經試過聚合函數產生期望的效果以及條件語句右,完全和外部聯接,但似乎無法得到它的工作就是我想要的。

如果我想返回狀態爲1的所有用戶,但如果他們沒有狀態爲1,2或3的項目時顯示0項,該怎麼辦?

this documentation它似乎像使用的代碼應該工作。

期望的結果是:

id | count(I.id) 
1  3 
2  0 
3  0 
+0

請嘗試更好地解釋你想要的預期結果 – carexcer

回答

1

試着這麼做:

SELECT S.id, count(I.id) FROM "Subscription" S 
LEFT JOIN "Item" I on I.id = S.item_id AND I.status IN (1,2,3) 
WHERE S.status = 1 
GROUP BY S.id 

你的老where條款,在過濾結果LEFT JOIN把它變成一個INNER JOIN

+0

完美!你絕對的美麗讓我在房子周圍多年。我沒有意識到你可以在聯合聲明中使用「on」和「and」。你可以在MySQL中做這個嗎? – JackalopeZero

+0

@JackalopeZero在MySQL中沒有嘗試過,但我確信你可以在任何RDBMS中完成它。 –

+0

@JackalopeZero當然 - 左連接謂詞是一個像其他任何東西一樣的表達式。 –