6

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

所以基本上,我有两个表,即tbl_curriculumtbl_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 

. . . 等等。

带有 Grade 和 Status 的 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

4 回答 4

5

您没有找到任何空值的原因是因为您的 where 子句正在搜索填充了 student_id_no 的行。但是,在学生没有上课的情况下,您拥有的数据 student_id_no 也将为空......因此您将过滤掉这些数据。

试试这个:

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

于 2012-12-10T04:15:46.223 回答
2

很简单,你用IS 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;
于 2014-10-17T14:38:34.173 回答
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')
于 2012-12-10T04:15:08.297 回答
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';
于 2014-10-23T08:06:20.610 回答