如何使这段代码在 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 框架的工作代码?
附注如果表中没有空洞(没有删除的行),此方法就可以正常工作,在我的情况下就可以了。
最佳答案
你想要做的确实是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 中完成这一切是可以完成的,但使用数据库抽象层读取或实现并不容易。
关于php - 使用 Kohana3 框架快速从表中获取随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13891732/