【问题标题】:Mysql join four tables and show NULL valueMysql连接四张表并显示NULL值
【发布时间】:2011-11-04 14:54:56
【问题描述】:

我需要查询每个学生的特定考试结果,我还想为没有输入分数的学生显示 NULL....

这是我的四张桌子

  1. Student
  2. Scores
  3. Student
  4. student_subject

我的表格链接

  • 成绩表 (user_id) 和学生表 (user_id)
  • 考试表 (id) 和分数表 (exam.id)
  • student_subject (user_id) 和学生表 (user_id)

  • student_subject (group_id) 和考试表 (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

输出

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

为@sceaj 编辑

我收到了你的查询(我将 WHERE Exam.id = 34 更改为 WHERE Exam.id = 36 以获得更好的测试)

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

【问题讨论】:

  • 请分享考试表结构。

标签: mysql join null


【解决方案1】:

以下应返回所有学生,如果存在,则返回考试 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 子句没有使用 student_subjects 或聚合函数中的任何内容,所以我不确定加入它的目的是什么?也许你可以从上面开始,然后从那里开始构建。

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

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

【讨论】:

  • 啊,我想我明白了。您想将输出限制为应该参加exam.id = 32的学生,但我不清楚您的students_subject结构和与考试的关系。
  • students_subjects 与该字段的考试相关联(students_subjects.group_id 和exam.group_id),因为我想获得所有学生(例如:group_id = 32)并且您查询不显示NULL字段,谢谢你是 awser
  • 上面的查询应该为整个学生表中的每一行返回 1 行。你介意发布你得到的结果吗?
  • 向@user1028498 道歉,LEFT JOIN 和 LEFT OUTER JOIN 是等价的,我混淆了 LEFT JOIN 和 INNER JOIN。
  • 是的,这是有道理的。试试看: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
【解决方案2】:

不要从分数表开始,加入所有其他表:你只会得到分数不为空的行。相反,做一个右连接,或者把分数表放在最后:

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

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多