如何计算MySQL会导致多次通过关系

时间:2013-03-13 10:40:15

标签: mysql sql count has-many relational-division

有很好的文章如何过滤有多种关系的结果: 的 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个结果添加内容即可。

2 个答案:

答案 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_clubclub的表别名。这允许仅为两个俱乐部的学生返回行。然后,使用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;