[前][次][番号順一覧][スレッド一覧]

mysql:6382

From: "小川 修" <"小川 修" <shuogawa@xxxxxxxxxx>>
Date: Wed, 9 Oct 2002 22:58:42 +0900
Subject: [mysql 06382] Re: servlet では order by rand() ができない?

いつも勉強させてもらっています。小川と申します。

城さんの問題とはすこし違うのですがrand()の問題なので投稿させてもらいます。

php 4.2.2
mysql  3.23.48
にて開発を行っております。

テーブルよりランダムに指定数のデータを取得したいと思い、
select * from テーブル where 条件 order by rand() limit データ数;
のSQL文をPHPスクリプトから発行したところ、希望の動作をする場合としない場合が
あります。

テーブルにはauto_incrementの主キーを使っているのですが、希望の動作をしない場
合は、主キーでソートされたようにデータが取得されます。

またコマンドラインから直接リクエストするとほぼ確実に期待どおりの動作をしま
す。

MYSQLの日本語マニュアルで調べたところ、以下のような記述がありました。

RAND() 値を持つフィールドは ORDER BY 節で使用できません。 ORDER BY はフィー
ルドを複数回評価するためです。 しかし MySQL バージョン 3.23 では, 次が可能で
す: SELECT * FROM table_name ORDER BY RAND() これは SELECT * FROM
table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000 のセットからラン
ダムなサンプルを得るのに便利です。 注意: WHERE 節の RAND() は WHERE が実行す
る度に再評価されます

実際のところ、このマニュアルの内容を完全に理解できていないのですが、
order by rand() と limitを併用することには問題があるのでしょうか?

マニュアルには他にも以下の記述があり

もし LIMIT を使用して限定した数だけ select を行うなら、 MySQL は、
ある場合←?
テーブルを全て走査するよりも、インデックスを使用しようとします。
もし LIMIT # を ORDER BY と共に使用するなら, MySQL は最初の # 行を見つけたら
すぐに、全テーブルのソートは行わずに、ソートを終わらせます。

ある場合にたまたま該当した場合、インデックスを使用しorder by rand()が死んで
しまうのではないかとも考えております。

自分だけでは答えが出せなかったもので、識者の方、是非アドバイスをお願いしま
す。

小川 修
shuogawa@xxxxxxxxxx



[前][次][番号順一覧][スレッド一覧]

      6339 2002-10-07 06:20 ["城" <sora_iro@xxxxx] servlet では order by rand() ができない?
      6343 2002-10-07 18:27 ┣["Takashi Yamashita" ]                                       
      6344 2002-10-07 18:30 ┃┗["Takashi Yamashita" ]                                     
      6347 2002-10-07 19:44 ┃ ┗["城" <sora_iro@xxxxx]                                   
      6348 2002-10-07 21:17 ┃  ┣["Takashi Yamashita" ]                                 
      6350 2002-10-07 22:25 ┃  ┗[Satoshi Komori <sato]                                 
      6352 2002-10-08 07:12 ┃   ┗["城" <sora_iro@xxxxx]                               
      6353 2002-10-08 12:06 ┃    ┗[Takeyuki Miyagawa <m]                             
      6361 2002-10-08 17:54 ┃     ┗["城" <sora_iro@xxxxx]                           
      6362 2002-10-08 18:15 ┃      ┗["kosugi" <kosugi@xxx]                         
      6346 2002-10-07 19:05 ┣["kosugi" <kosugi@xxx]                                       
      6349 2002-10-07 21:26 ┣["Takashi Yamashita" ]                                       
      6363 2002-10-08 18:59 ┣[<rio-t@xxxxxxxxxx>  ]                                       
      6380 2002-10-09 21:42 ┃┗["城" <sora_iro@xxxxx]                                     
->    6382 2002-10-09 22:58 ┗["小川 修" <shuogawa]                                       
      6392 2002-10-10 13:17  ┗["kosugi" <kosugi@xxx]                                     
      6424 2002-10-13 00:28   ┗["shuogawa" <shuogawa]                                   
      6425 2002-10-14 00:05    ┗[Tomoyuki Ishino <ish]