2014-01-21 42 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当然 - 左连接谓词是一个像其他任何东西一样的表达式。 –