如何在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。如果表中没有孔(没有删除的行),这种方法可以正常工作,在我的情况下这很好。
答案 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抽象层阅读或实现并不容易。