我为订阅群组的人提供了订阅记录表。有一个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的订阅记录)。
答案 0 :(得分:3)
我会使用group by
:
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
的记录。
你可以使用left join
做你想做的事。这是方法:
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;
因为它是left join
,所以第一个表的条件应该放在where
子句中。