• ベストアンサー

賢いSQL文がわからない

お世話になります。 メインテーブルAと詳細テーブルBがあります。  テーブルA(ID・名前)  テーブルB(ID・テーブルAのID・区分・内容) テーブルA:テーブルBは、1:Nの関係です。 またテーブルBがないものもあります。 名前あるいは名前と内容で検索をしたいのですが、 どのようにかけばいいのでしょうか? テーブルAの形で結果がほしいのですが。 よろしくお願いします。

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

  • ベストアンサー
  • oops1967
  • ベストアンサー率62% (5/8)
回答No.2

こんにちは、angelinaane様 以下のSQLではいかがでしょうか? SELECT tablea.ID,tablea.name FROM tablea LEFT JOIN tableb ON tablea.id = tableb.id WHERE tablea.name LIKE '%あああ%' AND tableb.kubun = 1 and tableb.naiyo >= 0 UNION SELECT tablea.ID,tablea.name FROM tablea LEFT JOIN tableb ON tablea.id = tableb.id WHERE tablea.name LIKE '%あああ%' AND tableb.kubun = 2 and tableb.naiyo >= 5 UNION SELECT tablea.ID,tablea.name FROM tablea LEFT JOIN tableb ON tablea.id = tableb.id WHERE tablea.name LIKE '%あああ%' AND tableb.kubun = 3 and tableb.naiyo <= 8 単純にUNIONで結合しただけです。 一応、条件通りだと思うのですが、もっと複雑な気がしています。 もしかして、 >区分1のとき内容が0以上 かつ >区分2のとき内容が5以上 かつ >区分3のとき内容が8以下 この条件は可変とか・・・ だとすると、プログラム中でSQLを組むだけなんですけどね。

angelinaane
質問者

お礼

oops1967様 朝から回答ありがとうございます。 結局のところ、テーブルBを3つ外部結合しましたら なんとか動いてくれました。 教えていただいたUNION結合でもできるのか まだ試していませんが、 UNIONって「かつ」の条件なんでしょうか。 「または」というイメージなんですけれど。 重複データのみがほしいです・・。 とりあえず、回答いただけてヒントになりました。 ありがとうございました。

その他の回答 (1)

  • oops1967
  • ベストアンサー率62% (5/8)
回答No.1

こんにちは、angelinaane様 WHERE条件が解らないので、取り敢えず or でやってみました。 一応、チェックはしたのですが、これで良いでしょうか? SELECT tablea.ID,tablea.name FROM tablea LEFT JOIN tableb ON tablea.id = tableb.id WHERE tablea.name = 'bbb' OR tableb.naiyo = 'bbb' ORDER BY ID なんか、もっと複雑なお話しのような気がします。

angelinaane
質問者

補足

oops1967様 回答ありがとうございます。 もうすこし正確に言いますと、 名前が「%あああ%」かつ 区分1のとき内容が0以上 かつ 区分2のとき内容が5以上 かつ 区分3のとき内容が8以下 というような条件です。 で、結果はテーブルAのIDでGROUP化したいのですが。

関連するQ&A

  • SQL文の書き方(こんなこと出来ますか)

    テーブルA(ID、A,B,中身) テーブルa(A、コードの名前1) テーブルb(B、コードの名前2) ID、A、コードの名前1、B、コードの名前2、中身という風に結果を得たいのですが、Aがテーブルaに存在する、又はBがテーブルbに存在するものを出力したいのですがJoinが良く分かりません。aまたはbに存在しない時はコードの名前はNullにしたく、また抽出されテーブルAのレコードが重複しないようにしたいのですが、考えても分かりません。ご教授下さるようお願い致します。

    • ベストアンサー
    • MySQL
  • SQL文を教えてください。

    社員テーブルと障害テーブルA、Bがあります。 社員テーブル(社員ID、発見者名、・・・etc) 障害テーブルA(障害番号、発生日、・・・etc) 障害テーブルB(事象、ステータス、対応内容、・・・etc) 社員ID、障害番号、事象、ステータスのSELECT結果を 一つのcsvファイルとして取得するプログラムを作成したいのです。 「複数のテーブルから」「任意の」列を指定して、 検索結果を「csvに出力」する方法がどうしても分かりません。 どのようなSQLになるでしょうか? うまく伝わっているでしょうか? よろしくお願いします。

  • SQL文を教えてください。

    社員テーブルと障害テーブルA、Bがあります。 社員テーブル(社員ID、発見者名、・・・etc) 障害テーブルA(障害番号、発生日、・・・etc) 障害テーブルB(事象、ステータス、対応内容、・・・etc) 社員ID、障害番号、事象、ステータスのSELECT結果を 一つのcsvファイルとして取得するプログラムを作成したいのです。 「複数のテーブルから」「任意の」列を指定して、 検索結果を「csvに出力」する方法がどうしても分かりません。 どのようなSQLになるでしょうか? うまく伝わっているでしょうか? よろしくお願いします。

  • select文

    お世話になります。 以下のような内容のテーブルA、B、Cがあります。 テーブルA  id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N テーブルAとテーブルCは「id」がキーで1:N このような3のテーブルで idを検索キーにして次のフィールドのデータを抽出したいのですが。。。(テーブルCのc_dateを降順で) id a_data a_date テーブルBのidで検索したレコード数 説明不足かもしれませんがよろしくお願いします。

  • sql文

    現在試合結果のSQL文を作っています。 テーブルは下記内容になっており、今までは個々のテーブルに試合日程IDを渡して表示させていました。 今までは ("select from 試合日程テーブル") ("select from 試合結果テーブル where 試合日程ID = 試合日程id") ("select from 試合味方得点者テーブル where 試合日程ID = 試合日程id") ("select from 試合相手得点者テーブル where 試合日程ID = 試合日程id") 現在はもっと簡単にできるのではないかと思い作り直そうと思っています。 試合日程テーブル | id | 相手 | | 0001 | 相手A | | 0002 | 相手B | | 0003 | 相手C | 試合結果テーブル | id | 試合日程ID | 得点 | 失点 | | 1 | 0001 | 6 | 0 | | 2 | 0002 | 4 | 4 | | 3 | 0003 | 0 | 5 | 味方得点者 | id | 試合日程ID | 得点者 | | 1 | 0001 | Aさん | | 2 | 0001 | Aさん | | 3 | 0001 | Bさん | | 4 | 0001 | Cさん | | 5 | 0001 | Dさん | | 6 | 0001 | Dさん | | 7 | 0002 | Aさん | | 8 | 0002 | Bさん | | 9 | 0002 | Cさん | | 10 | 0002 | Dさん | 相手得点者 | id | 試合日程ID | 得点者 | 1 | 0002 | 相手Aさん | | 2 | 0002 | 相手Bさん | | 3 | 0002 | 相手Cさん | | 4 | 0002 | 相手Cさん | | 5 | 0003 | 相手Aさん | | 6 | 0003 | 相手Aさん | | 7 | 0003 | 相手Aさん | | 8 | 0003 | 相手Cさん | | 9 | 0003 | 相手Cさん | ここで各試合結果を出したときに相手得点者、味方得点者をidごとに出す方法を教えていただけないでしょうか? 試してみたところ ("select from 試合日程テーブル") ("select from 試合結果テーブル) ( left join 試合味方得点者テーブル on 試合結果テーブル.試合日程ID = 試合味方得点者テーブル.試合日程id") ( left join 試合相手得点者テーブル on 試合結果テーブル.試合日程ID = 試合相手得点者テーブル.試合日程id") (where 試合結果テーブル.試合日程ID = 試合日程id) で試してみましたがうまくきませんでした。 上記のテーブルの内容で1試合に対し、得点者がちゃんと表示されるようにしたいです。 例:試合日程IDが0001の場合は味方得点者が6人分表示され、00002の場合は味方得点者が4人分と相手得点者が4人分表示されるように。 わかりにくい説明ではあると思いますが、宜しくお願いいたします。 足りない部分を指摘いただけると幸いです。

    • 締切済み
    • PHP
  • SQL文を教えて下さい

    2つのテーブルを比較して、片方のテーブルにしかない データを検索したいのですが、どのようなSQL文に なるのか 教えて下さい。 下記の例だと、AテーブルとBテーブルの両方にあるデータ以外のデータを検索したいので、下記の結果になります。よろしくお願いします 期待される結果 003 さああ 004 いいい 005 ううう 例 Aテーブル 001 あいう 002 えおお  003 さああ 004 いいい 005 ううう Bテーブル 001 あいう 002 えおお 

  • SQL文を教えてください。

    特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16

  • SQL文の書き方。初歩的ですみません。

    SQL文苦手で困っています。教えてください。 MSSQLserver8.0使用です。 以下のテーブル。 コードA 区分 コードB 数量 101     A    301    1 101     A    302    2 101     A    303    1 101     B    901    2 101     B    902    1 102     A    301    1 102     B    901    2 を、コードB単位に数量を集計し、区分別に左右に分け 以下のように帳票出力したいのですが。  301 A 2 |(区切り)| 901 B 4  302 A 2 |(区切り)| 902 B 1  303 A 1 group by 区分, コードBといきたいところなんですが。 使用している帳票出力ソフトの関係上、1ページ毎に出力しなければならず、 通常、A区分データが多いため、改ページのタイミングがずれます。 A区分のデータとB区分のデータをそれぞれ別に取得し(2つのSQL)、 2つの結果を交互に1行ずつよむ・・・という方法以外に、 1つのSQL文で、 1行目がA区分(301)、2行目がB区分(901)、3行目がA区分(302)・・ のように交互にデータを取得する方法ってありますか? うまく表現できなくてすみませんが、 よろしくお願いします。 

  • SQLについて

    MySQLの5.0を使用しています。 同一のテーブルA(a,b,c,d)があり、その中の区分が"1"のものと"2"のものを同一行で取得したいのですがどのようにすればよろしいでしょうか? テーブルAはaとbが主キーでcが区分であるときに結果としては a,b,c,d1,d2 ※d1はテーブルAのうち区分が1のもの ※d2はテーブルAのうち区分が2のもの すみませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文の書き方

    以下の様なテーブルがあったとして name ┌────┬───┐ │NAME_CD │ NAME │ ├────┼───┤ │1     │ hoge1│ ├────┼───┤ │2     │ hoge2│ ├────┼───┤ │3     │ hoge3│ └────┴───┘ id ┌───┬──┐ │ID_CD │ ID │ ├───┼──┤ │1    │ a1 │ ├───┼──┤ │2    │ b2 │ ├───┼──┤ │3    │ c3 │ └───┴──┘ 結果として ┌─┬───┐ │ID│ NAME │ ├─┼───┤ │a1│ hoge1│ ├─┼───┤ │b2│ hoge2│ ├─┼───┤ │c3│ hoge3│ └─┴───┘ のようにするにはどうしたらよいのでしょうか?

    • ベストアンサー
    • MySQL