Sql Postgres-左连接,同一个表
我有一个订阅组用户的订阅记录表。有一个groupid列和一个userid列(除了主键id之外)。我想查找订阅了组1但没有组2订阅记录的所有订阅行。我想我可以使用反连接模式,但我无法让它工作。我试过:Sql Postgres-左连接,同一个表,sql,postgresql,Sql,Postgresql,我有一个订阅组用户的订阅记录表。有一个groupid列和一个userid列(除了主键id之外)。我想查找订阅了组1但没有组2订阅记录的所有订阅行。我想我可以使用反连接模式,但我无法让它工作。我试过: SELECT * FROM subs s1 LEFT JOIN subs s2 ON s1.groupid=1 AND s2.groupid=2 AND s1.userid=s2.userid WHERE s2.id IS NULL; 但这不起作用(它返回的订阅记录的groupid不是1)。我将使
SELECT
*
FROM subs s1
LEFT JOIN subs s2 ON s1.groupid=1 AND s2.groupid=2 AND s1.userid=s2.userid
WHERE s2.id IS NULL;
但这不起作用(它返回的订阅记录的groupid不是1)。我将使用
groupby
实现这一点:
select s.userid
from subs s
group by s.userid
having sum(case when s.groupid = 1 then 1 else 0 end) > 0 and
sum(case when s.groupid = 2 then 1 else 0 end) = 0;
having
子句中的每个条件统计其中一个组的记录。第一个条件表示至少有一行groupid=1
。第二个表示没有groupid=2
的记录
您也可以使用左连接执行您想要的操作。方法如下:
SELECT s1.*
FROM subs s1 LEFT JOIN
subs s2
ON s1.userid = s2.userid AND s2.groupid = 2
WHERE s1.groupid = 1 AND s2.id IS NULL;
因为它是一个左连接
,所以第一个表上的条件应该放在where
子句中