sql - LEFT JOIN 混淆——我需要检索学生人数

标签 sql mysql join

我有四个表:

students
classes
teachers
teacher_assignments

classesteachers 具有多对多关系,因此 teacher_assignments 充当 xref 表(包含字段 teacher_idclass_id)。

students 中的每个学生都有一个 class_id(多对一 - 许多学生到一个类(class))。

我还应该提到 teacher_assignments 有一个 active 列 (BOOL),它指示该作业当前是否处于事件状态


我想做什么:

我想检索以下内容:

  • class_name -- 其级别和子级别的连接,例如3A
  • teacher_names -- 当前分配给该类(class)的教师姓名
  • student_count -- 每个类(class)的学生人数

起初,我尝试只检索 class_nameteacher_names,如下所示:

SELECT
    CONCAT(CONVERT(classes.level, CHAR(8)), classes.sub_level) AS class_name,
    GROUP_CONCAT(DISTINCT teachers.name SEPARATOR ',') AS teacher_names

FROM
    teacher_assignments
        LEFT JOIN teachers
            ON teachers.id = teacher_assignments.teacher_id
            AND teacher_assignments.active = TRUE
        LEFT JOIN classes
            ON classes.id = teacher_assignments.class_id

GROUP BY classes.id

这工作正常并输出:

 class_name | teacher_names
 --------------------------------------
 1A         | NULL
 2A         | John, Sam
 3B         | Sam, Sarah

(类(class) 1A 目前没有老师,因此预计为 NULL)

... 但是,现在我不知道如何将 student_count 加入其中。


我的问题:

在上面的查询中,students 表究竟应该如何与其他表连接,以便生成 student_count 列?

最佳答案

使用:

   SELECT CONCAT(CONVERT(c.level, CHAR(8)), c.sub_level) AS class_name,
          GROUP_CONCAT(DISTINCT teachers.name SEPARATOR ',') AS teacher_names,
          COUNT(s.id) AS studentCount
     FROM CLASSES c
LEFT JOIN TEACHER_ASSIGNMENTS ta ON ta.class_id = c.id
                                AND ta.active = TRUE
LEFT JOIN TEACHERS t ON t.id = ta.teacher_id
LEFT JOIN STUDENTS s ON s.class_id = c.id
 GROUP BY class_name

使用 MySQL 时,可以在 GROUP BY 中引用列别名,否则您必须复制生成 class_name 列值的逻辑。这也是 GROUP 所在的列,因为 GROUP_CONCAT 和 COUNT 是聚合函数。

要获得零作为计数值,您可能需要使用:

   SELECT CONCAT(CONVERT(c.level, CHAR(8)), c.sub_level) AS class_name,
          GROUP_CONCAT(DISTINCT teachers.name SEPARATOR ',') AS teacher_names,
          COALESCE(COUNT(s.id), 0) AS studentCount
     FROM CLASSES c
LEFT JOIN TEACHER_ASSIGNMENTS ta ON ta.class_id = c.id
                                AND ta.active = TRUE
LEFT JOIN TEACHERS t ON t.id = ta.teacher_id
LEFT JOIN STUDENTS s ON s.class_id = c.id
 GROUP BY class_name

关于sql - LEFT JOIN 混淆——我需要检索学生人数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769176/

相关文章:

php - 突然密码列抛出: SQLSTATE[42S22]: Column not found

Linux加入多行?

mysql - 仅当它们在另一个表中具有公共(public)记录时,才从用户名检索两个用户记录

php - 是否可以在 HTML/PHP 中为上传者自动选择文件?

mysql - 最快和/或最简单的方法是什么?

mysql UPDATE 不指定列名

带有明细表和事务的 MySQL 存储过程

mysql - LEFT JOIN 与主查询的相对值

mysql - 为什么我在使用 = 时找不到数据,但在使用时却显示出来

MySQL Select all distinct ID where all rows match the where close