2017-06-27 4 views
0

私は先生が学生にバッジを割り当てることができるプロジェクトに取り組んでいます。これは達成システムに似ています。MYSQL WHERE NOTクエリ

今、私は特定のバッジを持っていない学生の概観を得ようとしていますが、私が使っている質問はうまくいきません。

studentnumberbadge_idが保存されているStudentHasBadgeというテーブルを作成しました。

例: "English:Reading"バッジを持たない学生(s.studentnumber、s.firstname、s.lastname)のリストを表示したいと思います。

は、私は次のクエリを使用します。

(英語:読書は私のデータベースに61をbadge_idた)私も私も!=を試してみました

バッジを獲得した学生を得る結果として

SELECT DISTINCT s.studentnumber, s.firstname, s.lastname 
FROM students s INNER JOIN student_has_badge shb 
ON s.studentnumber = shb.studentnumber 
WHERE NOT shb.badge_id = 61 

WHERE NOTの代わりに、私は別の結果を与えません。

+0

あなたが得た結果を説明するだけです。あなたの質問は、バッジ61以外のバッジを獲得した学生を尋ねています。これには、バッジ61を獲得した学生と少なくとも1つの他のバッジが含まれます。答えは、私はゴードンのことを分かっています。最も簡単で、最高のパフォーマンスを発揮します。 – Uueerdo

答えて

1

NOT EXISTS

SELECT s.studentnumber, s.firstname, s.lastname 
FROM students s 
WHERE NOT EXISTS(SELECT 1 FROM student_has_badge 
       WHERE studentnumber = s.studentnumber 
       AND badge_id = 61); 
3

あなたはLEFT JOINを使用して、不一致を確認することができます。

SELECT s.studentnumber, s.firstname, s.lastname 
FROM students s LEFT JOIN 
    student_has_badge shb 
    ON s.studentnumber = shb.studentnumber AND shb.badge_id = 61 
WHERE shb.studentnumber IS NULL; 
+0

これは私のために働いた、ありがとう! – Maarten

+0

ちょっと質問がありますが、なぜあなたは0の生徒番号を探しますか? – Maarten

-1

は単語NOTを必要としないでください。 <>または=!のパラメータだけです。

SELECT DISTINCT s.studentnumber, 
       s.firstname, 
       s.lastname 

FROM students s 
JOIN student_has_badge shb ON s.studentnumber = shb.studentnumber 
WHERE 
shb.badge_id <> 61 
+0

しかし、これは必ずしもバッジを持っていない学生を返すとは限りません – Lamak

+0

あなたは正しいです。私はOPの質問を誤解しました。私は彼の質問を「バッジID 61の価値をどうして得られないのか」と読んだ。この特定のケースでは、@ Gordon Linoffは既にOPに答えている – Isaiah3015