【问题标题】:Joining four tables with left or right join [duplicate]用左连接或右连接连接四个表[重复]
【发布时间】:2018-12-27 14:56:35
【问题描述】:

我有四张桌子。

  1. 级别表级别(id,名称)
  2. 学生表学生(id、name、level_id)
  3. 主题表主题(id,名称)
  4. 报告表报告(id、student_id、subject_id、test、exam)

我需要一个查询来获取单个级别的结果(报告表)(例如 Class Oneid=1)和特定主题(例如 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'

但它只显示报告表内记录的结果。我期待学生表中指定 level_id 的所有数据,但如果结果表中没有记录,则他们的 testexam 行中的所有数据为 NULL。 p>

主要问题是查询中的 subject_id 子句(reports.subject_id = '2')。它仅在记录表Here is the result中存在时才用于记录

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

【问题讨论】:

标签: mysql


【解决方案1】:

但它只显示报告表内记录的结果

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

需要在join子句中指定reports表的谓词,而不是在where子句中,才能获取所有学生:

 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' 

【讨论】:

  • 我现在明白了 where 子句和 Join On 子句上的子句之间的区别...谢谢您的解释
【解决方案2】:

您可以尝试以下语句来获取所有 level=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 

【讨论】:

  • 感谢您的询问。但我认为 left join 将适合我的用例...
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 2019-05-03
  • 2014-02-04
  • 1970-01-01
  • 2015-09-30
  • 2013-02-13
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多