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

标签 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 框架的工作代码?

附注如果表中没有空洞(没有删除的行),此方法就可以正常工作,在我的情况下就可以了。

最佳答案

你想要做的确实是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/

相关文章:

php - Laravel 5.5,获取下一个/上一个 Eloquent 模型,按字母顺序排序 ‘slugs’

php - 通过 HTML 将复杂变量传递给 javascript 的正确方法

php - 使 HTML 表单元素变灰

php + mysql 编辑\更新表单

mysql - kohana框架中如何进行原始查询

php - MCRYPT 模式正在生成斜杠

javascript - 大家好。任何人都可以帮助我如何在提交按钮后形成错误消息,这是我尝试过但我无法获得的代码

mysql - Zabbix 升级 - 数据库升级失败

kohana - 如何在 Kohana ORM 中使用 BETWEEN 子句

php - 帮助建立图片库数据库