• 締切済み

~以外のものを検索する

今、履修テーブルと科目テーブルがあって 履修してる科目と履修していない科目をわけたい。 履修テーブル(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

  • ORACLEでwhere句の検索順序

    Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

  • テーブル名を*で検索できますか?

    同じ構造のテーブルが10個ぐらいあるのですが、 どのテーブルのカラムidに'001'が入っているかを SQLだけで検索することは可能でしょうか? 以下のようにやってみましたが駄目でした。 select * from log_0* where id='001' オラクルならできるなどでもOKです。 よろしくお願いします。

  • 4つのテーブルから、該当する項目を一度に検索したい。重複除く

    4つのテーブルから、それぞれ違う条件で検索し、該当する項目名NO を探したいのですが、どのようなselect文を書くと効率よく検索できる のでしょうか?また、重複NOは除きたいのです。 良かったら教えて下さい。 例えば、テーブル名:test1,test2,test3,test4とあった場合、 一度に該当するNOを拾い出す方法があれば、教えて下さい。 1.select no from test1 where code = '' and day < 20041118; 2.select no from test2 where day < 20041118; 3.2.select no from test3 where data != '' and day < 20041118; 4.select no from test4 where day > 20041018 and day < 20041118;

  • セレクト文

    学籍番号が1の学生について、科目番号が3の成績よりも良い成績の科目の科目番号と成績を得たい。ただし、通常の統合質問で回答せよ。 と言う問題です。 exercise=# select * from 履修; 科目番号 | 学籍番号 | 成績 ----------+----------+------ 1 | 2 | 80 2 | 1 | 90 2 | 3 | 70 1 | 3 | 100 1 | 4 | 50 1 | 7 | 80 1 | 10 | 75 ・・・・・ select 履修.科目番号,履修.成績 from 履修 where 履修.学籍番号=1; で学籍番号1の学生を選択できるのですが、科目番号3の成績よりも良い・・・と言うところが分かりません。 また、同じ条件で「入れ子型質問で回答せよ」と言うのもあります。よろしくお願いします。

  • DateTime型の検索

    お世話になっております。 質問内容は基本的な事かもしれませんがご容赦ください。 あるテーブルにDateTime型のフィールドがあり、Insertした日時を保存しています。 このフィールドに対して、日付のBETWEENや時間のBETWEENで検索かけるにはどうしたら良いのでしょうか。 例えば、 時間は未指定だけど、1月1日から1月31日までのデータを検索 SELECT * FROM table WHERE insertDT BETWEEN '01-01' AND '01-31' 日付は不明だけど、7:00から12:00までのデータを検索する等です。 SELECT * FROM table WHERE insertDT BETWEEN '07:00' AND '12:00' これら試しましたが、正常な結果が得られず困っています。 不明な部分の代替文字でもあるのでしょうか。 SELECT * FROM table WHERE (insertDT >= '07:00' AND insertDT <= '12:00') これも試しましたがやはりダメでした。 どなたかご教示の程、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 文字列のフィールドのOrderbyについて

    Oracle9iです。(厳密にはVB6も絡んでいます) 説明の便宜上、若干簡略化しています。 テーブルtestがあります。 SQL> desc test; 名前 NULL? 型 --------- -------- ---------------- ID VARCHAR2(10) です。 (1)testテーブルのデータが、 SQL> select id from test ; ID ---------- 3 5 11 551 のとき、select id from test where id between 1 and 4;を実行すると、 ID ------- 3 select id from test where id between '1' and '4';を実行すると、 ID ------- 3 11 となってしまいます。 別のケースで、 SQL> select id from test ; ID ---------- 3 5 11 551 C44433 aaa 6行が選択されました。 のデータの場合、 select id from test where id between 1 and 4;はORA-01722:数字が無効です のエラーとなり、 select id from test where id between '1' and '4';だと ID ------- 3 11 となってしまいます。 自分の希望としては select id from test where id between '1' and '4'にて、 ID ------- 3 のみ表示をさせたいです。 (2)SQL> select id from test ; ID ---------- 3 5 11 551 C44433 aaa のとき、たとえば、 select id from test where id between '12' and 'DD'; を実行し、12以上でDD以下のデータを取得したいのですが、 (理想) ID ---------- 551 C44433 実際は、 ID ---------- 3 5 551 C44433 と出てしまいます。 仕様は上司が考えてるので、 テーブル構造にそもそも問題があるのならそれ相応の説明をしたいと思っています。 ですが、基本的にはSQLの条件文を変更したいのですが、 アドバイスをいただけたらと思います。 ちなみに説明の簡略化のためフィールドを少なくしていますので select RPAD(id , 10) from test where ~ のように select のあとに変換するのはできません。 実環境は基本的には select * from ~としたいので。 よろしくお願いいたします。

  • sqlのVIEWの作り方

    mysqlでviewを作ろうと考えています。 書籍を調べて3日くらい格闘していましたが挫折してしまい アドバイスをいただきたく、質問いたします。 テーブル名: kamoku kamoku_id name ------------------ 001 国語 002 算数 003 理科 004 社会 テーブル名: siken siken_id siken_name kamoku_id1 kamoku_id2 kamoku_id3 ------------------------------------------------------- 000011 試験1回目 001 002 003 000012 試験2回目  001 003 004 000013 試験3回目 001 002 004 000014 卒業試験 003 004 null この2つのテーブルからVIEWを作りたいと考えています VIEW名 siken_kamoku siken_id siken_name kamoku_id1 kamoku_id2 kamoku_id3 ------------------------------------------------------- 000011 試験1回目 国語 算数 理科 000012 試験2回目  国語 理科 社会 000013 試験3回目 国語 算数 社会 000014 卒業試験 理科 社会 科目名を一回で取得できるようなViewを作りたいのですが CREATE VIEW view_siken_kamoku ( siken_id, siken_name, kamoku_name1, kamoku_name2, kamoku_name3 ) AS SELECT siken.siken_id, siken.siken_name, kamoku.kamoku_name, kamoku.kamoku_name, kamoku.kamoku_name WHERE siken_kamoku_id1 = kamoku.kamoku_id AND siken_kamoku_id2 = kamoku.kamoku_id AND siken_kamoku_id3 = kamoku.kamoku_id; 以上の文ですとエラーがでます。 どのような文にすれば、上記のようなVIEWがえられますでしょうか おたすけてください

    • ベストアンサー
    • MySQL
  • 同じフィールドから複数条件のAND条件で抽出する方法

    お世話になります。 同じフィールドから複数条件のAND条件で抽出する方法 DBはAccessです。 フィールド1がA フィールド2がBという条件でしたら Select 抽出フィールド form テーブル where フィールド1=A and フィールド2=B で行っています。 フィールド1がAまたはBでしたら Select 抽出フィールド form テーブル where フィールド1=A or フィールド1=B で行っています。 それではフィールド1がAもBも満たす抽出はどのようにしたら良いのでしょうか。 例: 学生テーブル  フィールド 学生ID、氏名 履修科目テーブル  フィールド 学生ID、同一学生内連番、科目 というテーブル構成で英語、国語のどちらも履修している学生を抽出する場合などです。 2テーブルをリンクしたクエリを作ったのですが、 単にフィールド 学生ID、氏名、同一学生内連番、科目 なのでどちらも履修している学生を抽出できませんでした。 どのようにしたらよろしいのでしょうか。よろしくお願いいたします。

  • 紐付いている3つのテーブルに対しての検索条件の指定がうまくいきません・・。

    紐付いている3つのテーブルに対しての検索条件の指定がうまく書けません。 3つのテーブルが紐付いています。 ・main_tableのIDと、note_id_tableのID ・note_id_tableのnote_IDと、note_value_tableのnote_ID main_table ID, name ----------- 1, aaa 2, bbb 3, ccc 4, ddd 5, eee note_id_table ID, note_ID ----------- 1, 1 1, 2 1, 3 1, 4 3, 5 3, 6 4, 7 4, 8 4, 9 5, 10 note_value_table note_ID, note_value ----------- 1, AAAA1 2, BBBB1 3, CCCC1 4, DDDD1 5, AAAA3 6, EEEE3 7, FFFF4 8, GGGG4 9, HHHH4 10, IIII5 検索の対象にしたいのは、note_valueです。 今まで、「note_valueに検索文字列が含まれている」main_tableのレコードを取得していました。 SELECT main_table.* FROM main_table LEFT JOIN note_id_table ON main_table.id = note_id_table.id LEFT JOIN note_value_table ON note_id_table.note_ID = note_value_table.note_ID WHERE note_value_table.note_value LIKE '%AAA%' 上記クエリだと、note_valueにAAAを含んでいるnote_ID:1,5を持つ、 main_tableのID:1,3のレコード、2件が返ってきます。 これを、検索文字列のNOT検索とAND検索に対応させたいのです。 NOT検索について、 WHERE NOT(note_value_table LIKE '%AAA%') としてみたのですが、main_tableのID:1,3,4,5のレコードが返ってきました。 期待した動作は、main_tableのID:2,4,5でした。 まず、note_value_tableにデータを持っていないmain_table.id:2はNULLのようで、 この条件では無視されてしまうようです。 また、main_table.id:1,3が返ってきてしまうのは、 main_table.id:1に紐付いているnote_IDの内、2,3,4と main_table.id:3に紐付いているnote_IDの内、6に条件が引っかかってしまうようなのです。 AND検索ですが、上記クエリの条件を WHERE note_value_table LIKE '%AAA%' AND note_value_table LIKE '%BBB%' としたところ、0件となってしまいました。 期待した動作は、note_valueにAAAとBBBを含んでいるnote_ID:1を持つ、 main_tableのID:1のレコード、この1件が返ってくることでした。 どうもこの条件だと、一つのnote_valueにAAAとBBBが含まれていないとHITしないようです。 結局JOINしているので、note_valueの数だけ同じmain_tableが前にくっついてるイメージなんですよね。 main_tableのレコード末端に、紐付いているnote_valueのフィールドを横に繋げるか、 紐付いているnote_valueの文字列を連結したものを一つのフィールドとして解釈するようなことができれば 実現できるのかなぁと思いました。 試行錯誤の末に、パフォーマンスが非常に悪いんですが、下記クエリで機能的には実現できたのですが、 これでは使えないので何かいいアイディアなどあればご教授お願いしたいです。 サブクエリを使いたくないというのがあります。 --AAAの検索 JOINする時に検索してしまうようにしてみました。 また、そのためには、note_id_tableからnote_IDを取得できていないとだめなので、 サブクエリ化してみました。 SELECT main_table.* FROM main_table LEFT JOIN note_value_table ON note_value_table.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table LIKE '%AAA%' WHERE note_value_table.note_value IS NOT NULL --AAAのNOT検索 WHERE条件を逆にするだけにしました。 --AAAとBBBの検索 検索条件1つに対して、JOINを増やしていくようにしました。 JOINが増えるのもそうですが、サブクエリも倍になってしまい、 検索条件を増やせば増やすほどパフォーマンスが落ちてしまいます。。 SELECT main_table.* FROM main_table LEFT JOIN note_value_table AS note_value_table1 ON note_value_table1.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table1 LIKE '%AAA%' LEFT JOIN note_value_table AS note_value_table2 ON note_value_table2.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table2 LIKE '%AAA%' WHERE note_value_table1.note_value IS NOT NULL AND note_value_table2.note_value IS NOT NULL

    • ベストアンサー
    • MySQL
  • 複数テーブルからLIKE検索を行いたいのですが、う

    複数テーブルからLIKE検索を行いたいのですが、うまくいかないので教えてください ■やりたいこと ・一つのキーワードで、MAINテーブル「hoge」カラムと、SUBテーブル「hoge」カラムを検索して、該当したレコードを表示したい ■テーブル構成 ・MAIN … 「id」「main1」「hoge」… ・SUB… 「sub_id」「main_id」「sub1」「hoge」… ・1つの「id」に対して、対応する「sub_id」が複数(「id」1は一つだけ。対応する「sub_id」1は複数あります) ■試したこと1 SELECT a.* , r.* FROM main a LEFT JOIN sub r ON a.id = r.main_id WHERE ( a.hoge LIKE '%キーワード%' OR r.hoge LIKE '%キーワード%' ) とやると、2件ヒットするはずなのに、1レコードしか取得できません(1レコードに「hoge」カラムが2つ入ります) ■試したこと2 SELECT a.* , r.hoge as rhoge FROM main a LEFT JOIN sub r ON a.id = r.main_id WHERE ( a.hoge LIKE '%キーワード%' OR r.hoge LIKE '%キーワード%' ) とやると、2件ヒットするはずなのに、1レコードしか取得できません(1レコードに「hoge」と「rhoge」カラムになります) ■試したこと3 FROMで2箇所指定するのかと思ったのですが、 SELECT a.* , r.* FROM (main a,sub r) LEFT JOIN r ON a.id = r.main_id WHERE ( a.hoge LIKE '%キーワード%' OR r.hoge LIKE '%キーワード%' ) 結果は、#1066 - Not unique table/alias: 'r'になります ■試したこと4 LEFT JOINがいらないのかと思い、削除したら、2件ヒットするはずなのに、たくさんヒットしてしまいます ■質問 欲しいのは、キーワード検索した際、該当カラムにヒットした数だけのレコードなのですが、どうすれば良いのでしょうか? ■例 ・東京で検索 ・MAINテーブル「hoge」カラム(2レコード)で2ヒット ・SUBテーブル「hoge」カラム(3レコード)で3ヒット ・ヒットした該当5レコードを取得したい

    • ベストアンサー
    • MySQL
このQ&Aのポイント
  • 男性がお尻を掘られることが好きで、それを妻にしてもらっているという質問です。いくつかの質問が続き、自身の性癖を理解してくれる妻に感謝しているとも述べられています。
  • この質問は、ゲイではないけれどお尻を掘られることが好きな男性がどう思われるかについての意見を求める内容です。性癖に対する理解を示す妻に感謝していると述べられています。
  • 男性がお尻を掘られることが好きで、それを妻にしてもらっているという質問です。性癖に対して理解を示し、妻に対する感謝の気持ちも述べられています。
回答を見る