- ベストアンサー
賢いSQL文がわからない
お世話になります。 メインテーブルAと詳細テーブルBがあります。 テーブルA(ID・名前) テーブルB(ID・テーブルAのID・区分・内容) テーブルA:テーブルBは、1:Nの関係です。 またテーブルBがないものもあります。 名前あるいは名前と内容で検索をしたいのですが、 どのようにかけばいいのでしょうか? テーブルAの形で結果がほしいのですが。 よろしくお願いします。
- みんなの回答 (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を組むだけなんですけどね。
その他の回答 (1)
- oops1967
- ベストアンサー率62% (5/8)
こんにちは、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 なんか、もっと複雑なお話しのような気がします。
補足
oops1967様 回答ありがとうございます。 もうすこし正確に言いますと、 名前が「%あああ%」かつ 区分1のとき内容が0以上 かつ 区分2のとき内容が5以上 かつ 区分3のとき内容が8以下 というような条件です。 で、結果はテーブルAのIDでGROUP化したいのですが。
お礼
oops1967様 朝から回答ありがとうございます。 結局のところ、テーブルBを3つ外部結合しましたら なんとか動いてくれました。 教えていただいたUNION結合でもできるのか まだ試していませんが、 UNIONって「かつ」の条件なんでしょうか。 「または」というイメージなんですけれど。 重複データのみがほしいです・・。 とりあえず、回答いただけてヒントになりました。 ありがとうございました。