• 締切済み

rand()を使った場合の全件ソートを避ける方法ありますか?

test1とtest2の結合しtest2にしかない複数のレコードから ランダムにc_idを取得したいのですがtest2で全件ソートしています。 もう少し、効率的な書き方はあるでしょうか? SELECT A.*, B.c_id FROM test1 A INNER JOIN (select a_id,b_id,c_id from test2 order by rand()) as B ON A.a_id = B.a_id AND A.b_id = B.b_id WHERE いろいろ GROUP BY いろいろ

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

なんかよくわからない仕様ですが、 >・test1とtest2を結合し、最後にtest1の項目でソート ってことはtest2でランダムでソートしたものが再度整列してしまうので 意味がないのでは? 仕様を再度つめなおしたほうがよいでしょう。

php4
質問者

お礼

説明が下手ですみません。 例えば:test2テーブルが id value a 1 b 2 c 3 d 4 であったとします。 1.from test2 order by rand() で、valueの3を取得したとします。 2.ここでtest1と結合します 3.from test1 order by point desc これでpointの高い順で並び、valueの値は毎回違う値になります。 ただtest2を全件からランダム取得しているので、 これがなんとかならないものかなぁと・・悩んでおります。

php4
質問者

補足

説明が下手ですみません、結局、元のSQLのまま行きました。 とりあえずIndexを張ればなんとかなるデータ量でしたので。

回答No.1

>test1とtest2の結合しtest2にしかない複数のレコードから 示されたSQLでは、「両方に存在する行」になっていますが? >test2で全件ソートしています 結合した結果をソートすればいいのでは? 「limit句等を使用して、取り出す行数を限定する」といった理由がないなら、サブクエリ中でソートする意味はないように思うのですが?

php4
質問者

お礼

> 示されたSQLでは、「両方に存在する行」になっていますが? テスト1と2で結合する項目のデータは両方にあるのですが、 ランダムで取得したい項目はtest2のテーブルにしかありません。 すみません。書き忘れてしまいましたが、SQLの最後にAとBを結合後の テーブルをtest1にある特定項目でORDER BYする必要があり、 これ以上のSQLが書けずにいます。条件を整理すると以下4つになります。 ・test1は、膨大なレコード ・test1 1:4 test2の関係 ・test2の4つからランダムで1つ取得 ・test1とtest2を結合し、最後にtest1の項目でソート