[SQL]同テーブルのデータ取得について

このQ&Aのポイント
  • 質問番号1に回答例1が入力され、かつ質問番号3に回答例3が入力されているIDをテストテーブルから取得する方法について教えてください。
  • SQLを使用して、テストテーブルから質問番号1に回答例1が入力され、かつ質問番号3に回答例3が入力されているIDを取得する方法を教えてください。
  • テストテーブルから、質問番号1に回答例1が入力され、かつ質問番号3に回答例3が入力されているIDを取得するにはどうすればいいですか。
回答を見る
  • ベストアンサー

[SQL]同テーブルのデータ取得について

お世話になります。 SQLについて知恵をかしてください。 テストテーブル ID 質問番号 回答 ------------------------------ 1   1   回答例1 1   2   回答例2 1   3   回答例3 2   1   AAAAAAA 2   2   てすとてすと 2   3   回答例3 3   1   回答例1 3   2   てすとてすと 3   3   回答例3 検索画面で画面に質問と回答欄(上記例だと3つ)があり、 「質問番号1に回答例1が入力され、かつ質問番号3に回答例3が入力されているIDをテストテーブルから取得したい」 と思っておりますが、SQLの作成がうまくいきません。 上記例だと、IDが1と3のデータを取得したい ※やりたいことのSQLです SELECT ID FROM TEST_TABLE WHERE (NUMBER = '1' ANSWER = '回答例1') AND (NUMBER = '3' ANSWER = '回答例3') よろしくおねがいいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

SQLは基本条件に合致した行を抽出するものですので、今回のように別の行をAND条件で括るのは、シンプルにはできません。 どれでもできるはずなので、理解しやすいものをお使いください。 1) ID別にデータを1行にしてから処理する SELECT ID FROM (SELECT ID, MAX(CASE WHEN 質問番号=1 THEN 回答 END) 回答1, MAX(CASE WHEN 質問番号=2 THEN 回答 END) 回答2, MAX(CASE WHEN 質問番号=3 THEN 回答 END) 回答3 FROM TEST_TABLE GROUP BY ID) tmp WHERE 回答1='回答例1' AND 回答3='回答例3' 2)上記の変型 SELECT ID FROM TEST_TABLE GROUP BY ID HAVING MAX(CASE WHEN 質問番号=1 THEN 回答 END)='回答例1' AND MAX(CASE WHEN 質問番号=3 THEN 回答 END)='回答例3' 3)ID/質問番号が主キーであるとして、合致した行の数で抽出 SELECT ID FROM TEST_TABLE WHERE (質問番号=1 AND 回答='回答例1') OR (質問番号=3 AND 回答='回答例3') GROUP BY ID HAVING COUNT(*)=2 4) サブクエリを使う SELECT DISTINCT ID FROM TEST_TABLE WHERE ID IN (SELECT ID FROM TEST_TABLE WHERE 質問番号=1 AND 回答='回答例1') AND ID IN (SELECT ID FROM TEST_TABLE WHERE 質問番号=3 AND 回答='回答例3')

Hakurinko
質問者

お礼

確かにすべてできそうです。 (さっそく月曜日に確認いたします) このような方法があるとは、ただ感嘆するばかりです。 大変お世話になりました。 ありがとうございました。

関連するQ&A

  • [SQL]同テーブルのデータ取得について2

    お世話になります。 SQLについて知恵をかしてください。 以前に質問させて頂き、解決したのですが新たな問題がでましたので 質問させていただきます。 テストテーブル ID 質問番号 回答 ------------------------------ 1   1   回答例1 1   2   回答例2 1   3   回答例3 1   3   回答例4 1   3   回答例5 「質問番号1に回答例1が入力され、かつ質問番号2に回答例2が入力されているIDをテストテーブルから取得したい」 ということで以下のSQLを作成しました。 SELECT ID FROM TEST_TABLE WHERE (質問番号=1 AND 回答='回答例1') OR (質問番号=2 AND 回答='回答例2') GROUP BY ID HAVING COUNT(*)=2 これで解決したのですが、「回答」が範囲指定されることがあり そうすると上記の件数が「2」ではなくなり取得できなくりました。 一意ではなくなった為、件数がおかしくなっております。 回答3 >= 1 and 回答3 <= 10 のように指定されます。 このような場合、1件しか取得しない方法はございますでしょうか。 重々難しいことは承知ですが、and以下で行いたいのです。 申し訳ございませんが知恵をかしてください。

  • SQLで条件の文字列を含んでいるデータを取得する方法

    SQLにて指定した文字列を含むデータを取得する方法を探しています。 例 テーブル Test 番号   条件 __________ 01    AA 02    BB 03    AA,CC 上記のように、番号と条件という2つのフィールドを持っているテーブルをTestとします。 (1)条件にAAと指定すると、番号01と03が取得。 (2)条件にBBと指定すると、番号02が取得。 (3)条件にAAAと指定すると、一致条件なし。 (1)~(3)のような条件を満たすSQLの構文はありませんでしょうか? ご教授お願いいたします。

  • SQLで取得可能でしょうか

    SQLで取得可能でしょうか 今2つのテーブルがあるとします。 ---------------------- テーブル1  KEY    項目   1   テスト1   2   テスト2   3   テスト3 ----------------------- ---------------------- テーブル2   CD  名称    1   か   1   き   2   さ   2   し   2   す   3   た ----------------------- テーブル1のKEYはキーで重複しません。 テーブル2のCDは重複しますが、内容はテーブル1のKEYとリンクします。 今、テーブル1のKEY1件につき、データを1件取得したいのですが、 テーブル2の名称も取得したいです。 データは1件しか取得しない為、名称は、特定文字(例として/)で 区切って取得したいです。 期待したい結果 ----------------------  KEY  名称   1  か/き   2  さ/し/す   3  た ---------------------- このような取得は可能でしょうか? 尚、SQLの発行は1回のみで行いたいです。 よろしくお願いします。

  • 1つのテーブルからのデータ取得

    お世話になります。 Table1にはA,Bのフィールドがあり 例えば A=01のレコードを取得(取得するフィールドはA,B) このレコードを(1)とする。 Table1のうち、Aが(1)のBと一致する レコードを(2)とする。 Table1のうち、Aが(2)のBと一致する レコードを(3)とする。 N番目のBと一致するTable1のAがなくなるまで 上記を繰り返す。 (1),(2),(3)・・・の A,Bの値を取得するためには どういうSQL文を書けばいいでしょうか? 例:ここでA=01を設定する テーブル例と結果 Table1 A: B 01:02 取得 02:04 取得 02:05 取得 03:04 X 04:06 取得 05:10 取得 07:11 X 10:15 取得 以上お教えください。よろしくお願いします。

  • SQLの書き方

    はじめまして SQL Serverを使用していますが、下記のSQLの書き方がわかりません。 申し訳けありませんが、わかる方がいらっしゃいましたら、どなたか教えて下さい。 ◆質問 テーブル1とテーブル2の下記のKEYで結合させて、取り出した結果でテーブル3を更新したいです。 テーブル2はデータが複数件一致してしまうため、無条件に先頭の1レコードだけを取り出したいです。 取得できたテーブル2のid_1とid_2とid_3をテーブル3に書き出したいです。 ○KEY テーブル1.test = テーブル2.test and テーブル1.test1 = テーブル2.test1 テーブル1.id_2 = テーブル3.id_1 and テーブル1.id_3 = テーブル3.id_2 ○テーブル1 id_1   id_2   id_3   test   test1 bbb   000001   001   000001  100 bbb   000002   001   000002  100 ○テーブル2 id_1   id_2   id_3   test   test1 aaa    1    99    000001   100 ← このレコードを取り出したい aaa    2    99    000001   100 aaa    3    99    000003   100 aaa    4    99    000004   110 ○テーブル3 id_1   id_2   id_3 000001  001  aaa-1-99   ←id_3にテーブル2で取得できたid1 + id2 + id3を書き出したい 000002  001 夜遅くにすみませんがお願いします。

  • テーブル上に存在しないデータの一覧を取りたい。

    mysql+phpで開発を行っています。 テーブル id 101 102 104 106 109 110 の様にデータが入っているテーブルaaaがあります。 プログラムで取得したid一覧が上記テーブルにレコードがあるのか確認するSQLは 例)select id from aaa where id in (101,102) で取得できるということは分かっています。 ここで select id from aaa where id in (102,103) とやると102の1件が取得できます。 今回知りたいことは 逆に取得できなかった103という値を取得する方法はないのかという事です。 select id from aaa where id=102; select id from aaa where id=103; 2回SQLを実行して値が戻ってこないSQL=テーブルにそのレコードが無いというプログラムを書けばいい事は分かっています。 しかし、処理が少なくとも数千回発生してしまう予定ですのでできれば別の方法がいいと思っています。 また、in区で使っている一覧はテーブルには入っておらず、また、こちらも数千個あるので、一時テーブルに入れるといってもかなりの時間がかかってしまうと思います。 何か一発で取得できるいい方法などありますでしょうか? ちなみにaaaテーブルは5万件ほどなので全件php側でメモリに展開してサーチも避けたいです よろしくお願いいたします。

  • 2つのテーブルからデータ取得

    いつもお世話になっております。 以下のようなテーブルがあります。 ---------- CREATE TABLE IF NOT EXISTS `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `student_number` bigint(20) DEFAULT NULL, `name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ---------- CREATE TABLE IF NOT EXISTS `student_upload` ( `student_number` bigint(20) NOT NULL, `upload_id` int(11) NOT NULL ) ---------- データは以下のように登録されています。 students ---------- id|student_number|name 1 |11111     |いちろう 2 |22222     |じろう 3 |33333     |さぶろう student_upload ---------- student_number|upload_id 11111     |1 11111     |2 22222     |1 22222     |2 ---------- student_upload.upload_id=1 のデータを取得したいので 下記のようなSQL文を発行しているのですが、student_upload.upload_id=2 の データも取得されてしまいます。 select * from students s, student_upload up where up.upload_id=1 and up.student_number=s.student_number よろしくご教示お願いいたします。 <環境>  PHP:5.3.5  MySQL:5.0.7

    • ベストアンサー
    • MySQL
  • SQL文でのデータの取得が上手くいきません

    初めて質問させていただきます。 こちらのカテゴリで良いのか分からなかったのですが、よろしくお願いいたします。 SQL文を作成しているのですが、上手くいかず困っている状況です。 要件としてはテーブルAにユーザーの情報が格納されているのですが、 キーの一つとして世代(SEDAI_NO)(日付)を持っております。 今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを 取得したいと思い以下のSQL文を作成しましたが、上手く行かず、最新世代を含むそれ以前の世代のデータを取得してきています。 どこがおかしいのでしょうか? よろしくお願いいたします。 【作成したSQL】 select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where SEDAI_NO = テーブルA’.SEDAI_NO AND 処理日 >= テーブルA'.SEDAI_NO)

  • SQLがわかりません。。

    すみません、単純な質問かもしれませんが、どう組み立てたら良いのか悩んでいますので、SQL文について質問させてください。 以下の様な2つのテーブルがあります。 ○テーブル1 ----------------------------------- ID bangou1 bangou2 1 1 2 2 3 4 3 2 4 ○テーブル2 ----------------------------------- ID bangou flag 1 1 1 2 2 1 3 3 0 4 4 1 ●希望する取得結果 テーブル1のID:1,ID:3 bangou1、bangou2は、テーブル2のIDを設定しています。 このとき、テーブル2のflagに0が設定されている場合はbangou1、bangou2のどちらにあってもテーブル1のIDは取得したくありません。 このSQLを組み立てる方法がいまいち思いつきません。 どうかアイデアをお願いします。

  • SQLで二つのテーブルを統合したい

    お世話になります。 Access2000のSQLで質問させて下さい。 下記のAとBのテーブルがある状態で、二つを統合した Cを生成したいのですが、どのようにSQLを作成したらよいでしょうか? お手数でもうしわけございませんが、SQL文で回答頂ければ助かります。 --テーブルA--- ID 名前 11 やまだ 12 さかもと --テーブルB--- ID 名前 25 きのした 26 つちや --C-- ID 名前 11 やまだ 12 さかもと 25 きのした 26 つちや