• 締切済み

~以外のものを検索する

今、履修テーブルと科目テーブルがあって 履修してる科目と履修していない科目をわけたい。 履修テーブル(knumは科目の番号、idは生徒の番号) knum id 1  2042201 2  2042201 3  2042201 4  2042201 5  2042201 6  2042201 7  2042201 1  2042205 2  2042205 3  2042205 科目テーブル(knumは科目番号 knameは科目名) knum kname 1  英語 2  世界史 3  日本史 4  地理 5  国語  6  数学 7  化学 8  物理 9  生物 というテーブルがあります。 select k.kname from kamoku k,risyu r where k.knum=r.knum and r.id=2042201; とすると 2042201の番号の生徒が履修してる科目を検索できることはできたのですが、履修してない科目を検索することができませんでした。 ちなみに select k.kname from kamoku k,risyu r where k.knum=r.knum and r.id!=2042201; とすると 2042205の学生の履修した科目が検索されてしまいます。 履修してる科目以外を検索するにはどうしたらよいですか? 教えてください。 バージョンは4.0です。

みんなの回答

回答No.3

一般的には「not in」や「not exists」がよく使われますが、MySQL バージョン4.0では、副問い合わせ(サブクエリ)が使えなかったと思います。その代替手段として、MySQLでは「left joinを使って、対応するキーが存在しなかったもの(nullになるもの)を検索する」という手法がよく取られます。 select k.kname from kamoku as k left join risyu as r on k.knum=r.knum where r.id=2042201 and r.knum is null

  • condo
  • ベストアンサー率37% (37/98)
回答No.2

 私は My SQL を使ったことがないので、以下の回答が My SQL できちんと動くかどうかは定かではありませんが・・・ その点、ご承知置きください。  多くのSQL環境下では、in句を使った以下のSQL文でお求めの答えが得られるのではないかと思います。 SELECT kamoku.kname FROM kamoku Where kamoku.knum not in (SELECT risyu.knum FROM risyu WHERE risyu.id=2042201);  なお、in句は、後続のサブクエリー(副問い合わせ)の回答に含まれるものを抽出します。ここでは not in としていることで「含まれないもの」を抽出しています。not を取り除けば、id=2042201 が履修している科目が出力されます。  他にも色々と作りようがあるかもしれませんが、私には My SQL での動作確認ができませんので、取り合えず無難そうなものをご紹介しました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

なかなか適当なワードで検索しにくいですけど この板でも何度か同じネタがあがっています。 left joinしてnullを検索するという手がよく使われます。 select k.kname from kamoku k left join risyu r on k.knum=r.knum and r.id=2042201 where r.knum is null

kinnniku21
質問者

お礼

たいへんありがとうございます。 おかげさまで動きました。。

関連するQ&A