【问题标题】:How to count MySQL results in a has-many-through relation如何计算 MySQL 结果中的 has-many-through 关系
【发布时间】:2013-03-13 10:40:14
【问题描述】:

有一篇很好的文章如何过滤具有多关系的结果: 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 和&& 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 个结果中添加一些内容。

【问题讨论】:

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


    【解决方案1】:

    可能是最简单、最干净和最快的只有两个学生

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

    【讨论】:

    • 非常感谢。它真的很简单。
    • 你能解释一下查询最后的“x”是什么意思吗?
    • @IkaPkhakadze:这是AS x 的缩写,是子查询的别名。 FROM 列表中的每个子查询都需要在 SQL 中命名。
    【解决方案2】:

    查询使用表 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;
    

    【讨论】:

    • CLUB1 和 CLUB2 只是示例。它可以是 3 个或更多。使用“Martin 2”方法并计算结果会很棒。
    • 问题一经回答,请不要更改!您当前的问题是“CLUB1 && CLUB2 有多少学生?”,我的回答解决了这个问题。
    • 对不起,如果我没有解释清楚,但对我来说这不是一个解决方案。
    猜你喜欢
    • 2011-11-13
    • 2017-07-31
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多