有很好的文章如何过滤有多种关系的结果: 的 How to filter SQL results in a has-many-through relation
我只是在寻找COUNT结果的解决方案,而不是全部显示。
student {
id
name
}
club {
id
name
}
student_club {
student_id
club_id
}
CLUB1&&amp ;; CLUB2吗
修改 从下面的链接中使用“Martin 2”方法会很棒:
SELECT s.stud_id, s.name
FROM student s
JOIN student_club sc USING (stud_id)
WHERE sc.club_id IN (30, 50)
GROUP BY 1,2
HAVING COUNT(*) > 1;
只需向COUNT个结果添加内容即可。
答案 0 :(得分:2)
对于两个学生来说,可能是最简单,最干净,最快的 :
SELECT count(*) AS ct
FROM student_club x
JOIN student_club y USING (stud_id)
WHERE x.club_id = 30
AND y.club_id = 50;
只要您知道自己感兴趣的student
列表,就无需加入stud_id
表格。
对于任意数量的学生,Martin的查询更方便。您可以以类似的方式简化:
SELECT count(*) AS ct
FROM (
SELECT stud_id
FROM student_club
WHERE club_id IN (30, 50)
GROUP BY 1
HAVING count(*) = 2 -- adapt to number of items in list
) x;
当然要求(stud_id, club_id)
是唯一的,并且列表项也是唯一的。
答案 1 :(得分:0)
查询使用表student_club
和club
的表别名。这允许仅为两个俱乐部的学生返回行。然后,使用COUNT
可以返回学生人数:
SELECT COUNT(*) AS nb
FROM student s, student_club sc1, club c1, student_club sc2, club c2
WHERE s.id=sc1.student_id AND sc1.club_id=c1.id AND c1.name="CLUB1"
AND s.id=sc2.student_id AND sc2.club_id=c2.id AND c2.name="CLUB2"
如果您真的想使用“Martin 2”查询,您可以通过这种方式计算记录数量:
SELECT COUNT(*) AS nb
FROM (
SELECT s.stud_id, s.name
FROM student s
JOIN student_club sc USING (stud_id)
WHERE sc.club_id IN (30, 50)
GROUP BY 1,2
HAVING COUNT(*) > 1
) tmp;