我有四张桌子:
students
classes
teachers
teacher_assignments
classes
和teachers
具有多对多关系,因此teacher_assignments
充当xref
表(包含字段teacher_id
和{{1} }})。
class_id
中的每个学生都有一个students
(多对一 - 多个学生到一个班级)。
我还应该提到class_id
有一个teacher_assignments
列(BOOL),表示该作业当前是否有效
我想检索以下内容:
active
- 其级别和sub_level的concat,例如class_name
和3
A
- 当前分配给该班级的教师的姓名teacher_names
- 每个班级的学生数量首先,我尝试仅检索student_count
和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
目前没有教师,因此预计会有NULL)
... 但是,现在我不知道如何将1A
用于此。
student_count
表格应该如何与上述查询中的其他表格结合,以便生成students
列?
答案 0 :(得分:2)
使用:
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 on的列,因为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
答案 1 :(得分:1)
只是想到我的头脑......
classes
和students
表格以获得学生数量...... classes
进行左连接,而是使用#1的结果进行左连接(基本上是classes
和students
表之间的内连接),它可以让你拉动学生数。答案 2 :(得分:0)
我不认为我会使用连接,而是会在学生上使用内联列选择:
SELECT
CONCAT(CONVERT(classes.level, CHAR(8)), classes.sub_level) AS class_name,
GROUP_CONCAT(DISTINCT teachers.name SEPARATOR ',') AS teacher_names,
( SELECT COUNT(*) FROM students WHERE students.class_id = classes.id ) AS student_count
FROM ...