2

このコードを Kohana3 フレームワークで機能させるにはどうすればよいですか? 構文に問題があります。

ORM::factory('table1')
->where ( 'id', '=', ceil( DB::expr('rand()')  * [SELECT max(id) from table1] ) )
->find();

それが、テーブルからランダムな行を選択する方法です。

これは小さなテーブル (1000 行以上を含む) では問題なく動作しますが、大きなテーブルではうまくいきません:

ORM::factory('table1')
->order_by(DB::expr('RAND()'))
->find();

私が望むものに相当する標準のmysqlは、次のようなものです。

SELECT name
  FROM table1 JOIN
       (SELECT CEIL(RAND() *
                    (SELECT MAX(id)
                       FROM table1)) AS id
        ) AS r2
       USING (id);

では、それを Kohana3 フレームワークの作業コードに変換するにはどうすればよいでしょうか?

PS この方法は、テーブルに穴がない場合 (削除された行がない場合) に正常に機能し、私の場合は問題ありません。

4

1 に答える 1

2

あなたがやろうとしていることは、実際には MySQL の問題です。任意のサイズのテーブルに対して実行するには、適切なクエリが必要です。よりスケーラブルな実装は、PHP を使用して最大 ID 未満の乱数を生成し、それを選択することです。

最高の ID を取得します。

SELECT MAX(id) max_id FROM table1

PHP では、選択する「id」を取得します。

$rand_id = mt_rand(0, $max_id-1);

次に、LIMIT 1 を使用してランダム レコードを選択するクエリを作成し、穴があっても機能するようにします。

SELECT * FROM table1 WHERE id>=$rand_id ORDER BY id LIMIT 1

MySQL ですべてを行うことはできますが、DB 抽象化レイヤーを使用して読み取りや実装を行うのは簡単ではありません。

于 2012-12-15T21:29:32.477 に答える