假设我有一个MySQL表read
,它记录了一个userid
和一个articleid
,记录了用户阅读了哪些文章。我现在要列出已阅读文章1
,2
和3
的用户。
我知道以下是不可能的,但它说明了这个想法:
SELECT id
FROM user
WHERE (1,2,3) IN (SELECT articleid FROM `read` WHERE userid=user.id);
这应该检查表1
中的2
,3
和articleid
是否为read
针对特定userid
。这就是我对多对一IN语句的意思。
我可以在SQL中使用这个问题吗?
答案 0 :(得分:2)
您可以使用聚合和having
子句:
SELECT userid
FROM read
WHERE articleid IN (1, 2, 3)
GROUP BY userid
HAVING COUNT(DISTINCT articleid) = 3;
注意:如果read
中没有重复项,请使用COUNT(*)
代替COUNT(DISTINCT)
。
答案 1 :(得分:1)
试试这个
SELECT id
FROM user
WHERE exists
(
SELECT 1 FROM `read` WHERE userid=user.id
and articleid in (1,2,3)
having count(distinct articleid) = 3
);
对于给定的userid
,如果只有1,2,3
应为articleid's
,那么
SELECT id
FROM user
WHERE exists
(
SELECT 1 FROM `read` WHERE userid=user.id
having count(case when articleid in (1,2,3) then 1 end)= count(*)
);