LEFT JOIN混乱 - 我需要检索学生计数

时间:2011-01-22 16:55:36

标签: sql mysql join

我有四张桌子:

students
classes
teachers
teacher_assignments

classesteachers具有多对多关系,因此teacher_assignments充当xref表(包含字段teacher_id和{{1} }})。

class_id中的每个学生都有一个students(多对一 - 多个学生到一个班级)。

我还应该提到class_id有一个teacher_assignments列(BOOL),表示该作业当前是否有效


我想做什么:

我想检索以下内容:

  • active - 其级别和sub_level的concat,例如class_name3
  • A - 当前分配给该班级的教师的姓名
  • teacher_names - 每个班级的学生数量

首先,我尝试仅检索student_countclass_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列?

3 个答案:

答案 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)

只是想到我的头脑......

  1. 加入classesstudents表格以获得学生数量......
  2. 您不会在上述查询中对classes进行左连接,而是使用#1的结果进行左连接(基本上是classesstudents表之间的内连接),它可以让你拉动学生数。

答案 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 ...