使用Kohana3框架从表中随机获取一行 - 快速

时间:2012-12-15 11:24:10

标签: php mysql kohana-3

如何在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框架的工作代码?

P.S。如果表中没有孔(没有删除的行),这种方法可以正常工作,在我的情况下这很好。

1 个答案:

答案 0 :(得分: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抽象层阅读或实现并不容易。