Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算MySQL的结果在一个有很多通过关系_Mysql_Sql_Count_Has Many_Relational Division - Fatal编程技术网

如何计算MySQL的结果在一个有很多通过关系

如何计算MySQL的结果在一个有很多通过关系,mysql,sql,count,has-many,relational-division,Mysql,Sql,Count,Has Many,Relational Division,有一篇很好的文章介绍了如何在一个数据库中过滤结果,它有很多关系: 我只是在寻找计数结果的解决方案,而不是全部显示 student { id name } club { id name } student_club { student_id club_id } 两个俱乐部1和俱乐部2都有多少学生? 编辑: 使用下面链接中的“Martin 2”方法将非常好: SELECT s.stud_id, s.name FROM student s JOI

有一篇很好的文章介绍了如何在一个数据库中过滤结果,它有很多关系:

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

student {
    id
    name
}
club {
    id
    name
}
student_club {
    student_id
    club_id
}
两个俱乐部1和俱乐部2都有多少学生?

编辑: 使用下面链接中的“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
可以返回学生人数:

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;

对于两名学生来说,可能是最简单、最干净、最快的:

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"
你根本不需要加入
student
表,只要你知道你感兴趣的
stud\u id
列表

对于任何数量的学生来说,马丁的查询都更方便。您可以以类似的方式进行简化:

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\u id,club\u id)
是唯一的,并且列表项也是唯一的。

CLUB1和CLUB2只是示例。它可以是3个或更多。这将是伟大的使用“马丁2”的方法和计数结果。请不要改变您的问题,一旦它被回答了!您当前的问题是“俱乐部1和俱乐部2共有多少名学生?”,我的回答解决了这个问题。对不起,如果我没有正确解释,但对我来说这不是一个解决方案。非常感谢。它真的简化了。你能解释一下查询最后的“x”是什么意思吗?@IkaPkhakadze:That是
AS x的缩写,是子查询的别名。“发件人”列表中的每个子查询都需要SQL中的名称。