如何使用SQL Left Join返回空值

时间:2012-12-10 03:57:21

标签: mysql left-join

请查看这个SQL Fiddle的表格以及我尝试过的查询:
SQL Fiddle

基本上,我有两个表,即 tbl_curriculum tbl_enrolled_subjects

tbl_curriculum 包含学生应根据其课程(course_id)学习的所有科目(subject_id)。
tbl_enrolled_subjects 包含学生根据 tbl_curriculum 参加/注册的所有科目。

我想检查学生选择哪些科目,哪些科目不是,查询应该返回如下内容:

Subject_id|Grade|Status
23        | 2   |Passed
24        | 2   |Passed
31        | 2   |Passed
50        | 2   |Passed
83        | 1   |Passed
27        |NULL |NULL 
28        |NULL |NULL 
29        |NULL |NULL 

。 。 。 等等。

具有成绩和状态的Subject_ID表示学生已经学习了该科目。另一方面,NULL值表示学生尚未学习这些科目 我使用了这个查询:

SELECT a.subject_id, b.grade, b.status
FROM tbl_curriculum a
LEFT JOIN tbl_enrolled_subjects b
ON a.course_id = b.course_id  AND a.subject_id = b.subject_id
WHERE b.student_id_no='05-0531';

但我一直只接受学生的科目。

Subject_id|Grade|Status
23        | 2   |Passed
24        | 2   |Passed
31        | 2   |Passed
50        | 2   |Passed
83        | 1   |Passed

我错过了什么吗?提前谢谢。

4 个答案:

答案 0 :(得分:5)

您没有找到任何空值的原因是因为您的where子句正在搜索填写了student_id_no的行。但是,对于你所拥有的数据,如果学生没有上课,那么student_id_no也将为null ...因此你将过滤掉那些。

试试这个:

SELECT a.subject_id, b.grade, b.status, b.student_id_no
FROM tbl_curriculum a
LEFT JOIN tbl_enrolled_subjects b
ON a.course_id = b.course_id  AND a.subject_id = b.subject_id
where student_id_no is null or student_id_no = '05-0531'
order by subject_id

http://sqlfiddle.com/#!2/4c7b2/43

答案 1 :(得分:2)

非常简单,您使用IS EMPTY

在您的实体中,您已经定义了一个反向键,然后调用您的实体主体,其中反向键是EMPTY。

SELECT a FROM tbl_curriculum a WHERE a.enrollers IS EMPTY;

然后我在tbl_enrolled_subjects

中定义了一个类似tbl_curriculum的字段课程
/**
 *
 * @ORM\OneToMany(targetEntity="tbl_enrolled_subjects", mappedBy="id")
 */
private $enrollers;

答案 2 :(得分:1)

尝试此查询::

SELECT a.subject_id, b.grade, b.status
FROM tbl_curriculum a
JOIN tbl_enrolled_subjects b
ON a.course_id = b.course_id  AND a.subject_id = b.subject_id
WHERE b.student_id_no='05-0531'
union
select subject_id,null,null 
from tbl_curriculum
where concat(subject_id,course_id) not in (
  select  concat(subject_id,course_id)
from tbl_enrolled_subjects
 WHERE student_id_no='05-0531')

答案 3 :(得分:1)

我相信将学生过滤器放入JOIN谓词也可以得到理想的结果。它适用于SQL Fiddle,但我不知道它如何影响查询计划。

SELECT a.subject_id, b.grade, b.status
FROM tbl_curriculum a
LEFT JOIN tbl_enrolled_subjects b
ON a.course_id = b.course_id  AND a.subject_id = b.subject_id
**AND** b.student_id_no='05-0531';