请查看这个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
我错过了什么吗?提前谢谢。
答案 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
答案 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';