Mysql连接四个表并显示NULL值

时间:2011-11-04 14:54:56

标签: mysql join null

我需要进行查询以获得每个学生的特定考试成绩,并且我还想为没有输入成绩的学生显示NULL ....

这是我的四个表

  1. Student
  2. Scores
  3. Student
  4. student_subject
  5. enter image description dsds

    enter image description here

    enter image description here

    enter image description here

    我的表格链接

    • 带有学生表(user_id)的分数表(user_id)
    • 考试表(id)与分数表(exam.id)
    • 带学生表(user_id)的student_subject(user_id)

    • 带有考试表(group_id)的student_subject(group_id)(由于某些重要原因,我的组数据库在另一个数据库中)

    我的查询有效,但对于没有输入分数的学生,我没有NULL值

    SELECT 
        scores.result, students.id, exam.name, exam.id
    FROM 
        scores
    LEFT JOIN  
        students ON scores.user_id = students.user_id
    LEFT JOIN 
        exam ON exam.id = scores.exam_id
    LEFT JOIN 
        students_subjects as ss ON ss.user_id = students.id
    LEFT JOIN 
        students_subjects ON students_subjects.group_id = exam.group_id
    WHERE
        exam.id = 32
    GROUP BY
        scores.id
    

    输出

    enter image description here

    如何为每个没有特定考试成绩的学生(exam.id = 32)获取空值?

    为@sceaj编辑

    我得到了你的查询(我更改WHERE exam.id = 34 for WHERE exam.id = 36 for better testing)

    SELECT scores.result,students.id,exam.name, exam.id
    FROM exam
    INNER JOIN students_subjects ON students_subjects.group_id = exam.group_id
    INNER JOIN students ON students_subjects.user_id = students.user_id
    LEFT OUTER JOIN scores ON scores.user_id = students.user_id
    WHERE exam.id = 36
    

    enter image description here

2 个答案:

答案 0 :(得分:2)

以下内容应该返回所有学生,如果他们存在,则从考试32中得分。

SELECT scores.result,students.id,exam.name, exam.id
FROM exam
INNER JOIN scores ON exam.id = scores.exam_id
RIGHT OUTER JOIN students ON scores.user_id = students.user_id
WHERE exam.id = 32

你的select子句没有使用students_subjects或聚合函数中的任何东西,所以我不确定它的连接是什么?也许你可以从上面开始并从那里开始构建。

编辑:基于我的第一条评论的新策略。尝试找到所有学生,然后找到存在的分数,如果没有则为空。

SELECT scores.result,students.id,exam.name, exam.id
FROM exam
INNER JOIN students_subjects ON students_subjects.group_id = exam.group_id
INNER JOIN students ON students_subjects.user_id = students.user_id
LEFT OUTER JOIN scores ON scores.user_id = students.user_id
  AND scores.exam_id = exam.id
WHERE exam.id = 32

答案 1 :(得分:0)

不要从得分表开始,离开加入所有其他人:你只会获得得分不为空的行。相反,做一个正确的联接,或将得分表放在最后:

SELECT scores.result,students.id,exam.name, exam.id
FROM 
students LEFT JOIN scores ON scores.user_id = students.user_id
LEFT  JOIN exam on exam.id = scores.exam_id
LEFT JOIN students_subjects as ss ON ss.user_id = students.id
LEFT JOIN students_subjects ON students_subjects.group_id = exam.group_id
where exam.id = 32
group by scores.id