MYSQLの1対多テーブルにおけるSELECT文に関して質問です。


以下のような本テーブルと、レヴューテーブルがあります。
【bookTbl】
bid 連番
title 名前
gaiyo 概要

【reviewTbl】
rid 連番
bid 本の番号
kanso 感想

内容例。
【bookTbl】
1,ゴルゴ13,スナイパーが大活躍。
2,どらえもん,ネコ型ロボットが大活躍。
3,ハンターハンター,ネテロと王の対決の行方。
4,トリコ,グルメハンター「トリコ」の珍道中

【reviewTbl】
1,2,やっぱり王道のまんがはこれですよね!
2,3,念の能力はもう何でもありなのでは?最早どらえもん要らず。
3,1,大人になってから見ると面白い!
4,1,終に宇宙空間まで行っちゃた。
5,2,オレはコロコロ派。
6,1,象牙狩りのハンターを狩る話が好き。

これで、「本タイトル」「本概要」「感想」に対してあいまい検索を掛けたいです。

本タイトルの結果を得れるSQL文を教えてください、宜しくお願いします。
※コメント欄に補足あり。

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2011/07/16 16:24:01
  • 終了:2011/07/16 22:28:59

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912011/07/16 17:12:22

ポイント100pt
SELECT DISTINCT title FROM bookTbl WHERE bid IN 
((SELECT bid FROM bookTbl WHERE gaiyo LIKE "%ハンター%")
UNION
(SELECT bid FROM reviewTbl WHERE kanso LIKE "%ハンター%"))

のような感じでどうでしょうか。

id:ruijio

ご回答ありがとうございます。

ごめんなさい、1点大事なところが抜けてました。

「本のタイトル」を取得・・・と書きましたが、抜き出したいのは「bookTbl」の全体の結果です。

SELECT DISTINCT title,no,gaiyo ・・・とやるとうまく取れませんでした。


【追記】

もしかしたら、回答頂いた、「SELECT DISTINCT title」を「SELECT DISTINCT bid」にし、更にbookTbl を取得するselect文を書き、前述の箇所をin()内に入れればいけるかも知れません。試してみます。

2011/07/16 19:11:26
  • id:ruijio
    例えば、感想テーブルにはゴルゴ13に関するレビューが3件、どらえもんが2件入ってます。トリコは0件です。

    どらえもんで検索すると「どらえもん、ハンターハンター」
    大活躍⇒「ゴルゴ13、どらえもん」
    ハンター⇒「ゴルゴ13、ハンターハンター、トリコ」

    という結果が得たいです。
    宜しくお願いします。
  • id:Mook
    すぐに確認できる状態ではないですが、
    DISTINCT はあってもなくても動作に影響はない気がします。

    >SELECT DISTINCT title,no,gaiyo ・・・とやるとうまく取れませんでした。
    というのも不可解ですが、どうできなかったのでしょうか。

    いずれにせよ、まずは単純に DISTINCT を外してみてどうでしょうか。
  • id:ruijio
    Mookさん

    すみません、失礼しました。

    提示頂いた、ソースだと動かなかったのと、以前Distinctを使った際、思うように動作しなかったので充分検証しませんでした。

    下記の通りにしたら動きました。サブクエリ(?)のカッコが1重多かったようです。
    `title`を * にしてもデータ抽出できました。有難う御座いました。

    SELECT DISTINCT `title` FROM `bookTbl` WHERE `bid` IN
    (
    SELECT `bid` FROM `bookTbl` WHERE `gaiyo` LIKE "%ハンター%"
    UNION
    SELECT `bid` FROM `reviewTbl` WHERE `kanso` LIKE "%ハンター%"
    )
  • id:Mook
    こちらの PC をリストアした関係で現在 MySQL が動かず、検証できないのですが、
    http://dev.mysql.com/doc/refman/4.1/ja/union.html
    を参考にしたので、UNION 前後に()を入れましたが、検証不十分ですみません。

    肝心なタイトルが抜けてしまっていたようです。
    SELECT * FROM bookTbl WHERE bid IN
    (
    SELECT bid FROM bookTbl WHERE gaiyo LIKE "%ハンター%"
    UNION
    SELECT bid FROM reviewTbl WHERE kanso LIKE "%ハンター%"
    )
    OR title LIKE "%ハンター%"
    のように拡張すればできるでしょうか。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません