- - PR -
10万件のデータでmin()関数を使ったときに実行されない
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-03-05 12:42
いや、ぜんぜん構わないです。むしろ有り難い。格好つけて「ヒントをくれ」なんて言ってすいませんでした(汗。本当に助かります。 一応いただいたSQLを自分なりに解釈してみたのですが、間違っていないでしょうか? ・Aは room と room_cost を結合したもの。仮に room 内に house_rent が含まれていれば A などせず room をそのまま使えば良い ・Bは各propertyにおける最小のhouse_rentのリスト あと、実際の処理では以下のような流れになっているんです。この流れに対していただいたSQL(以下、G-SQLと略)をそのまま適用したらダメですよね…? 1. ユーザーが入力した条件により絞り込み(例えば house_rent >= 50000 とか、普通ないと思うけど) 2. その「絞り込んだ結果」から各propertyの最も安いroomを取得 これってもし以下のようなテーブルだと動かないと思うんです(面倒だから全部つなげて書きます) --------------------------------------- room_id, property_id, house_rent 1, 1, 20000 2, 1, 50000 3, 1, 75000 --------------------------------------- 絞り込んだ結果をCとします。G-SQLのAの部分はCと入れ替わると思うので ---C(A)------------------------------------------------- select property_id, room_id, house_rent from room_cost, room where room.id=room_id and house_rent >= 50000 -------------------------------------------------------- ---Result of C(A)--------------------------------------- room_id, property_id, house_rent 2, 1, 50000 3, 1, 75000 -------------------------------------------------------- っとなって、G-SQLのB部分は ---Result of B------------------------------------------ room_id, property_id, house_rent 1, 1, 20000 -------------------------------------------------------- これを inner join したら結果が0ってなると思います。BにもCが摘要できればいいんですが、それって言うのはこういう感じでOKでしょうか?考え方・構文等間違っているところがあれば教えていただけると助かります(ちなみに sqlite3 では動き、結果も予想通りのように見えた) ※ group by property_id は各propertyからどれでもいいから最安のroomを一つだけ得るために加えてあります。distinctで出来ればいいのですがhttp://d.hatena.ne.jp/justforfun/20080414/1208141971に書いてある方法だとsqlite3ではエラーが発生してしまいました。
加えた部分・変更した部分は太字にしてあります。 | ||||||||
|
投稿日時: 2009-03-05 13:01
AとBのロジック上の解釈はその通りですが、
この二つの意味というか役割を考えてみてください。 シンプルにいけば以下でとれると思うんですがだめですか?。 (実験してませんが、そういうつもりで作ったので)
| ||||||||
|
投稿日時: 2009-03-05 13:34
なるほど、役割としては
・A: 必要なColumnを取得するためのテーブル ・B: 絞り込み条件用のテーブル ということですね(よね?) 先のようなコードを書いたのは既に絞り込みを行ったテーブルが存在していたからです。そのテーブルをCとすれば以下のような感じですかね? ※ ORMを利用しているため完全なシンプルSQLはかけないのでこの様な回りくどい書き方をします。
こういう書き方ならCがどんなテーブルでOKですよね?(property_idとhouse_rentが存在していれば) | ||||||||
|
投稿日時: 2009-03-05 14:07
B側の where room.id=room_id は結合条件ですので、なくていいと思いますが
たぶんそれでうまくいくと思います。 | ||||||||
|
投稿日時: 2009-03-05 23:46
>デューン様
一番最初に提示したデータを再び作成し実験して見たところ無事に動作しました。 無知な僕に色々とご親切に教えていただいて有難うございました^^ |
«前のページへ
1|2|3