代码之家  ›  专栏  ›  技术社区  ›  denoise

在MySQL中使用groupby在COUNT中包含零

  •  2
  • denoise  · 技术社区  · 7 年前

    我希望在MySQL中进行查询,列出所有学院及其学生人数,给出以下表结构:

    mysql tables

    我的查询如下所示:

    SELECT `f`.`id`, `f`.`name`, COUNT(*) `total`
    FROM `student` `s`
    INNER JOIN `course` `c` ON `c`.`id` = `s`.`course_id`
    LEFT JOIN `faculty` `f` ON `f`.`id` = `c`.`faculty_id`
    GROUP BY `c`.`faculty_id`
    ORDER BY `f`.`name`
    

    我得到的结果是:

    query result

    但是我需要得到所有的院系,甚至那些没有注册学生的院系。

    course 我得到了同样的结果。

    2 回复  |  直到 7 年前
        1
  •  8
  •   Madhur Bhaiya    7 年前

    如果你想要所有的能力;联接的起始表应该是faculty表。然后相应地对另一个表执行左联接。

    使用以下查询:

    SELECT `f`.`id`, `f`.`name`, COUNT(`s`.`id`) AS `total`
    FROM `faculty` AS `f` 
    LEFT JOIN `course` AS `c` ON `f`.`id` = `c`.`faculty_id` 
    LEFT JOIN `student` AS `s` ON `c`.`id` = `s`.`course_id` 
    GROUP BY `f`.`id`, `f`.`name` 
    ORDER BY `f`.`name`
    
        2
  •  0
  •   Guy Louzon    7 年前

    您需要重新显示查询,您的主表是faculties(或使用right join): 重要的 学生您需要处理可能出现的空值,加入学生表:

    SELECT
    `f`.`id`, `f`.`name`, SUM(IF(s.id IS NULL, 0,1) `total`
    FROM
    faculty f
    LEFT JOIN course c ON `f`.`id` = `c`.`faculty_id`
    LEFT JOIN student s ON `c`.`id` = `s`.`course_id`
    GROUP BY `c`.`faculty_id` ORDER BY `f`.`name`
    
    推荐文章