我有四个表:
students
classes
teachers
teacher_assignments
classes
和 teachers
具有多对多关系,因此 teacher_assignments
充当 xref
表(包含字段 teacher_id
和 class_id
)。
students
中的每个学生都有一个 class_id
(多对一 - 许多学生到一个类(class))。
我还应该提到 teacher_assignments
有一个 active
列 (BOOL),它指示该作业当前是否处于事件状态
我想做什么:
我想检索以下内容:
class_name
-- 其级别和子级别的连接,例如3
和A
teacher_names
-- 当前分配给该类(class)的教师姓名student_count
-- 每个类(class)的学生人数
起初,我尝试只检索 class_name
和 teacher_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/