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 回答