料理テーブル(A)と材料テーブル(B)があったとして、その料理に使う材料の関係性をつなぐ中間テーブル(C)があったとします。(いわゆるhasAndBelongsToManyな関係のテーブルです)
材料として、りんご、はちみつを検索し、料理テーブルからカレーとアップルパイを引っ張りだすSQL文が浮かびません。
材料が少なければサブクエリを繋いで探す方法はなんとなーく浮かんだんですけれど、材料が増えてくるとその分だけサブクエリも増え、著しくレスポンスが悪くなる気がします。
なるべくレスポンスを悪くせずに検索する方法はありますでしょうか?
Aのカラム(他にもカラムはある、値段等々)
idとcook(料理名)
1,カレー
2,生姜焼き
3,プリン
4,アップルパイ
Bのカラム
idとmaterial(素材名)
1,リンゴ
2,豚肉
3,ハチミツ
4,牛乳
5,砂糖
6,塩
Cのカラム
idとAid、Bid
1,1,1
2,1,3
3,1,4
4,2,2
5,2,6
6,3,3
7,3,4
8,3,5
9,4,1
10,4,3
11,4,5
一応どうにか考えたクエリです
sql
1select * 2from A 3join 4(/* 以下のクエリで材料テーブルを横に並べ替えている */ 5 select 6 aid, 7 /* ↓の2行が、検索する材料が増えると増えていく */ 8 case when sum(case when bid = 1 then 1 else null end) = 1 then 1 else 0 end as material_1, 9 case when sum(case when bid = 3 then 1 else null end) = 1 then 1 else 0 end as material_2 10 from C 11 group by aid 12 having material_1 = 1 and material_2 = 1 /* ここも材料分増える */ 13) as B 14on A.id = B.aid
何かあんまりスマートじゃないですよね・・・
中間テーブルが増えたらかなりレスポンスも悪くなるような気もしますし・・・
ちなみにcakephpで開発中なんですけれど、上のSQLを効率よくcakephpのfind文にできるんでしょうか???
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/04 04:52