1

有一篇很好的文章如何过滤具有多关系的结果: How to filter SQL results in a has-many-through relationship

我只是在寻找 COUNT 结果的解决方案,而不是全部显示。

student {
    id
    name
}
club {
    id
    name
}
student_club {
    student_id
    club_id
}

CLUB1 && 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 结果中添加一些内容。

4

2 回答 2

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)当然是唯一的,并且列表项也是唯一的。

于 2013-03-13T14:44:20.870 回答
0

该查询使用表别名student_clubclub. 这仅允许为两个俱乐部中的学生返回行。然后,使用COUNTallows返回学生人数:

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;
于 2013-03-13T10:59:04.303 回答