2011-11-04 50 views
2

我需要做一个查询来获得每个学生的特定考试的结果,我也想显示为NULL的学生谁没有进入他的分数....Mysql加入四个表并显示空值

这里是我的四个表

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

enter image description dsds

enter image description here

enter image description here

enter image description here

我的表链接

  • 评分表(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 

输出

enter image description here

我怎样才能为每个学生没有得分为特定的考试,谁空值(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 

enter image description here

+0

请分享考试表格结构。 – sceaj

回答

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 
+0

啊,我想我明白了。你想限制输出的学生应该采取exam.id = 32,但你的students_subject结构和考试的关系是不清楚 – sceaj

+0

因为我想让所有学生(例如:group_id = 32),并且你qu​​erry不显示NULL字段,所以students_subjects与该字段的考试(students_subjects.group_id with exam.group_id)相关联, thx for you awser –

+0

上面的查询应该为整个学生表中的每行返回1行。你介意发布你得到的结果吗? – sceaj

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 
+0

我得到了相同的结果oupout比我的例子:(但thx –