【问题标题】:Join 3+ tables using Doctrine Query Builder or MySQL query使用 Doctrine Query Builder 或 MySQL 查询加入 3+ 个表
【发布时间】:2014-12-24 06:55:17
【问题描述】:

我是 symfony2 开发的新手。我正在尝试开发电子学校课程管理系统,这是我对 6 个表格的总结。

    Students
    ----------
    Id  Firstname
    1   John
    2   Susan
    3   Sarah

    Courses
    ----------
    Id  Name
    1   ICT
    2   Math
    3   PE

    Students_Courses
    ----------
    Student_Id  Course_Id
       1          1
       1          3
       2          2
       2          1
       3          1

    Grades
    ----------
    Id Student_Id Course_Id Grade Quarter_Id
    1      1          1        90      1
    2      2          1        80      1

    Quarters
    -----------
    Id Name
    1  Semester 1
    2  Semester 2
    3  Semester 3
    4  Semester 4

    Quarters_Courses
    ------------
    Quarter_id     Course_Id
        1             1
        3             1
        2             2
        4             3

我正在使用下面的查询

    SELECT * FROM Students AS s LEFT JOIN Grades as g on g.student_id = s.id where g.quarter_id=1

它在下面显示结果

    John      90
    Susan     80

但我想要显示结果如下的查询(如果 Quarter_id 等于 1)

    John      90
    Susan     80
    Sarah      

【问题讨论】:

    标签: mysql sql select left-join where


    【解决方案1】:

    将您的条件置于 JOIN 而不是 WHERE 条件中,因为如果您将右表的任何条件置于 where 条件中,那么它将被视为 INNER JOIN 而不是 LEFT JOIN:

    试试这个:

    SELECT s.Firstname, IFNULL(g.Grade, '') AS Grade  
    FROM Students AS s 
    LEFT JOIN Grades as g on g.student_id = s.id AND g.quarter_id=1;
    

    【讨论】:

    • 感谢您的及时回复,它似乎有效。但是另外我如何按课程过滤?
    • 当我使用“SELECT * FROM Students AS s LEFT JOIN Grades as g on g.student_id = s.id AND g.quarter_id=1 AND g.course_id = 1”时,它显示所有学生在与第一季度相关的课程中。不仅是在课程 1 和第一季度的学生。
    • 每门课程可以在不同的学期进行。例如:ICT课程只能在第一学期和第二学期进行,第三学期和第四学期不能进行。第一学期和第二学期可以为每个学生评分。它也可能是可变的,这就是为什么我也必须按课程过滤。
    • 例如:学校有数学和ICT课程。数学课程在第 2 学期和第 3 学期进行,有 2 名学生。 ICT课程仅在第一学期进行,有3名学生。但是其中2个学生有成绩,另一个没有成绩(成绩表中没有相关记录。)。作为查询结果,它必须向我显示 2 个学生的成绩和一个学生的唯一姓名。
    • 如果我添加 course_id=1 它会显示学生表中的所有三个学生。但目前只有2个被选中ICT课程(course_id=1)
    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多