6

テーブルと私が試したクエリについては、このSQL Fiddleを参照してください:
SQL Fiddle

つまり、基本的に、tbl_curriculumtbl_enrolled_subjectsという2つのテーブルがあります。

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

4 に答える 4

5

null が見つからない理由は、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

于 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

学生フィルターを 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 に答える
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 に答える