用左或右联接联接四个表

时间:2018-07-19 12:50:52

标签: mysql

我有四个桌子。

  1. 级别表级别(ID,名称)
  2. 学生表学生(ID,名称,级别ID)
  3. 主题表主题(编号,名称)
  4. 报告表报告(id,student_id,subject_id,测试,考试)

我需要一个查询,该查询将获取单个级别(例如,第一类 id = 1 )和特定主题(例如< strong> id = 2 ,例如 English

我有这个查询:

select name, test, exam 
from `reports` 
right join `students` 
on `reports`.`student_id` = `students`.`id` 
where `students`.`level_id` = '1' 
and `reports`.`subject_id` = '2'

但是它仅显示报告表中记录的结果。如果没有结果表中的记录,期望从students表中指定了level_id的所有数据,但在其 test exam 行中为NULL。 >

主要问题是查询中的subject_id子句(reportssubject_id ='2')。它仅在记录表Here is the result

中存在时才可用于记录

当我使用不在结果表Here is the result -not returning anything中的subject_id时

2 个答案:

答案 0 :(得分:1)

  

但是它仅显示报告表中记录的结果

并非完全正确-仅在reports.subject_id = '2'处显示结果。如果报表表中没有匹配的行,则subject_id将为null,并且null不等于2。

您需要在join子句中而不是where子句中为report表指定谓词,以获取所有学生:

 select name, test, exam 
 from `reports` 
 right join `students` 
 on `reports`.`student_id` = `students`.`id` 
 and `reports`.`subject_id` = '2'
 where `students`.`level_id` = '1' 

答案 1 :(得分:0)

您可以尝试使用以下语句获取所有= 1级的学生

select name
     , test
     , exam 
  from students 
  join reports 
    on  students.id = reports.student_id 
   and reports.subject_id = 2 
 where students.level_id = 1