mysql:6424
From: "shuogawa" <"shuogawa" <shuogawa@xxxxxxxxxx>>
Date: Sun, 13 Oct 2002 00:28:42 +0900
Subject: [mysql 06424] Re: servlet では order by rand() ができない?
ご返答ありがとうございます。そして、返信がおくれまして申し訳ございません。 引き続きPHPスクリプトから発行した、order by ,limitを併用したクエリーの誤動作 に関してです。ご協力お願いします。 > > またコマンドラインから直接リクエストするとほぼ確実に期待>>ど おりの動作 をします。 > > 「ほぼ」というのが気になるのですが。コマンドラインで失敗する > ケースはどのようなクエリの場合でしょうか? データ数が少なかったため、断定を避けていたのですが、不適切でした。コマンドラ インから発行するクエリは確実に動作します。 それで、今回のシステムですがWEB上にて広告をランダム挿入するシステムです。 広告は下記のようなテーブルに保管しており、siteid(サイトのID)tmplid(使用す るテンプレートのID)areaid(テンプレート内に定義されたエリアのID)そして広告 開始日と広告終了日より広告を検索し自動挿入するプログラムを書いております。 広告出力の枠(最大表示数)はきまっているため、結果をランダムに最大表示数だけ とりだす必要があります。 mysql> describe addb; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | adid | int(11) | | PRI | NULL | auto_increment | | siteid | int(11) | YES | | NULL | | | tmplid | int(11) | YES | | NULL | | | areaid | int(11) | YES | | NULL | | | start | date | YES | | NULL | | | end | date | YES | | NULL | | | adhtml | text | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ 以上よりSQL分は select * from addb where start<=now() and end > now() and siteid=サイトのID and tmplid= テンプレートのID and areaid = エリアのID order by rand() limit 最大表示数; としております。 先ほども書きましたが、コマンドラインからのクエリ発行では期待通り動作するので すが、PHPスクリプトから動作させると、ランダム出力が死んでしまうことがありま す。実際にシステムを稼動させあるページの広告はランダムに変化するのに、ある ページは広告が一切変化しないといった状況です。 +------+--------+--------+--------+------------+------------+ | adid | siteid | tmplid | areaid | start | end | +------+--------+--------+--------+------------+------------+ | 137 | 1 | 2 | 1 | 2002-07-10 | 2002-10-20 | | 218 | 1 | 2 | 1 | 2002-09-12 | 2002-11-13 | | 183 | 1 | 2 | 1 | 2002-08-30 | 2002-10-31 | | 230 | 1 | 2 | 1 | 2002-10-01 | 2002-10-31 | この上の4つの広告は1枠にランダムに25%の確率で表示します。 select * from addb where siteid=1 and tmplid=2 and areaid=1 and start <=now() and end >now() order by rand() limit 1; ランダムに広告を挿入することができました。 | 138 | 1 | 3 | 50 | 2002-07-10 | 2002-10-20 | | 233 | 1 | 3 | 50 | 2002-10-02 | 2002-11-02 | この上の2つの広告は1枠にランダムに50%の確率で表示します。 select * from addb where siteid=1 and tmplid=3 and areaid=50 and start <=now() and end >now() order by rand() limit 1; なぜだか、広告ID138のみ常に表示される 前回の投稿で、ある場合limitがindexのみを使用しクエリ結果を出力するのではと書 きましたが、考えてみればこのクエリーはindexを使用していません。また、他に思 い当たる事もない状況です。 皆さんの中に、order by,limitの併用で誤動作を経験をされたことがある方はいらっ しゃいますでしょうか。 大変長くなってしまいましたが、情報をお待ちしております。 PS この件の検討過程で、order by rand() の出力のランダム性を確認してみました。 たとえば、1,2,3,4の数字をランダムに10000回取り出す実験で、 たとえば 2650回、2500回、2500回、2350回表示などの結果が得られました。MAXと MINに常に10%ぐらいの差がある感じです。 この値は乱数の結果としては優秀なんでしょうか? いずれにしても、MYSQLの乱数処理で少してこずっている今日この頃です。
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]