質問 |
||
| QNo.3490294 | 関連テーブルの検索方法 | |
|---|---|---|
| 質問者:superplastic |
以下のテーブル関連で、以下のロジックで、recipe_id だけの一覧を取得するのは、1本のSQLではどのようにすればよいでしょうか? #あとこのような、クエリーの事をなんと呼べばいいのでしょうか…。 #適切質問タイトルが思い浮かばなかったので、提示してもらえるとありがたいです。 recipe recipe_id | name 1 | ズッキーニとオリーブのトマトパスタ 2 | ズッキーニとオリーブのトマトのマリネ 3 | ズッキーニのアリオリ 4 | 野菜のフリッター recipe_ingredients recipe_ingredient_id | recipe_id | master_id 1 | 1 | 1 | ※ ズッキーニとオリーブのトマトパスタ 2 | 1 | 2 | ※ ズッキーニとオリーブのトマトパスタ 3 | 1 | 3 | ※ ズッキーニとオリーブのトマトパスタ 4 | 1 | 4 | ※ ズッキーニとオリーブのトマトパスタ 5 | 2 | 1 | ※ ズッキーニとオリーブのトマトのマリネ 6 | 2 | 2 | ※ ズッキーニとオリーブのトマトのマリネ 7 | 2 | 3 | ※ ズッキーニとオリーブのトマトのマリネ 8 | 3 | 1 | ※ ズッキーニのアリオリ 9 | 3 | 4 | ※ ズッキーニのアリオリ 10 | 4 | 1 | ※ 野菜のフリッター ※ はわかりやすくつけただけで、実際のテーブルデータではないです。 vegetables vegetable_id | name 1 | ずっきーに 2 | おりーぶ 3 | とまと 4 | にんにく ロジックはアンド検索で: 検索条件「ズッキーニ、トマト」で検索したら、 「ズッキーニとオリーブのトマトパスタ」と「ズッキーニとオリーブのトマトのマリネ」 検索条件「にんにく、ズッキーニ」で検索したら、 「ズッキーニとオリーブのトマトパスタ」と「ズッキーニのアリオリ」 が見つかる。 名前でLike検索はしない。 全く持って想像がつかないので教えてください。 ちょっと考えてみたんですが、↓では、1〜4のレシピ全てが見つかってしまうのですよね…。 select recipe_id from recipe inner join recipe_ingredients using ( recipe_id ) inner join vegetables using ( vegetable_id ) where vegetables.name like '%ずっきーに%' or vegetables.name like '%にんにく%' ; もしかして、以下でしょうか? select recipe_id from recipe inner join recipe_ingredients using ( recipe_id ) inner join vegetables using ( vegetable_id ) where vegetables.name like '%にんにく%' INTERSECT select recipe_id from recipe inner join recipe_ingredients using ( recipe_id ) inner join vegetables using ( vegetable_id ) where vegetables.name like '%ずっきーに%'; なんとなくコストが高そうなので、他に方法はないでしょうか? |
|
困り度:
|
||
| 質問投稿日時: 07/11/05 03:12 |
||
回答良回答20pt |
|
| ANo.1 | recipe_ingredients表のmaster_id列と、vegetables表のvegetable_id列が対応しているのですね? recipe表の野菜の名前はカタカナですが、vegetables表のname列はひらがななのですか? などなど、いろいろと引っ掛かる点があるのですけどね。 SQL例を示しますから、実行結果が期待通りか確認すると共に、どういうことをやっているか調べてみてください。 select tR.* from tR inner join (select R_id from tRI inner join tV on M_id=V_id where name in('ズッキーニ','トマト') group by R_id having count(*)=2) as x on tR.R_id=x.R_id order by tR.R_id |
|---|---|
| 回答者:chukenkenkou | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 07/11/06 16:10 |
|
| |
| この回答へのお礼 | ありがとうございます! having って一度も使ったことありませんでした…。 group by した結果に対して、条件で絞り込むことができるんですね! 二つのVegetablesの名前で検索したら、 2行のrecipe_ingredientsが引っかかったものが全てに 合致したもので、あるから、recipe_id を Group by でカウントを取った 結果に対して、絞り込むと言うことですよね? ご指摘いただいたとおり、 [recipe_ingredients.master_id と vegetables.vegetable_id が対応]で正しいです。 すみませんサンプル作るときにカラム名を間違えてしまったようです。 vegetablesについても、 ずっきーに、おりーぶ、とまと はカタカナのつもりになっていました。 ご指摘の通りです。すみません。 情けない不備がたくさんあったのに、 回答いただいてありがとうございました! 助かりました。 |