mysql - 基于session的随机查询结果

标签 mysql cakephp cakephp-1.3

我有一个配置文件表,我想以随机顺序列出配置文件,我已经完成了这样的操作:

$this->paginate = array('User' => array('conditions'=>array('User.userstanding_id'=>'1'), 'order' => 'RAND()', 'limit' => '10')); 

唯一缺少的功能是,我希望配置文件按顺序排列,以便在下一页上不会出现重复项,甚至当您浏览完所有配置文件时,根本看不到某些配置文件。页面。

我正在寻找一种方法来找到查询的随机起点,然后从该起点开始按顺序分页。也许每个 session ?

最佳答案

MySQL RAND() function可以将整数作为参数用作种子,始终产生相同的结果:

为了演示这一点,这里有一个包含 3 个单列字符串记录的表:

mysql> select * from chartest;
+--------+
| string |
+--------+
| AA     |
| AB     |
| BB     |
+--------+
3 rows in set (0.00 sec)

如果我在 ORDER BY 中使用 1 作为 rand() 的种子值,它将始终产生相同的结果排序:

mysql> select * from chartest order by rand(1);
+--------+
| string |
+--------+
| BB     |
| AA     |
| AB     |
+--------+
3 rows in set (0.00 sec)

mysql> select * from chartest order by rand(1);
+--------+
| string |
+--------+
| BB     |
| AA     |
| AB     |
+--------+
3 rows in set (0.00 sec)

如果我将种子更改为 2,则顺序会发生变化:

mysql> select * from chartest order by rand(2);
+--------+
| string |
+--------+
| AB     |
| BB     |
| AA     |
+--------+
3 rows in set (0.00 sec)

选择你的种子

您可以将用户的 session ID 转换为整数并将其传递给此函数,以便对于该 session ,结果始终以相同的方式排序。

例如,如果 session ID 是 MD5 散列,为了避免处理这些值表示的大(160 位)整数,只需从字符串中删除字符(例如使用 preg_replace ('/[^\d\s]/', '', $sessionid);)。然后获取前 5 个左右的数字并将其转换为 (int) 以用作种子:

$seed = substr($numeric_id, 0, 5);

更新

要在使用 CakePHP 时将参数传递给 RAND() 函数,以确保将其视为整数而不是字符串,请尝试在 $conditions 中使用以下语法code> 数组的顺序:

'order' => 'RAND(CAST('.$seed.' AS SIGNED))' 

关于mysql - 基于session的随机查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5716675/

相关文章:

mysql - 与 null 相比,为什么零日期不是 null?

php - 我怎样才能使这个 SQL 查询更有效率? PHP

database - Cakephp:如何读取 session 中的用户数据?

php - CakePHP - 如何使用 Helpers 与目标 ="_blank"建立图像链接

MySQL:产品、属性、库存水平

mysql - 数据建模 - 电话号码的单独表格?多对多关系?

mysql - 如何进行表连接,其中组合键是访问号码和日期 +/- 1 天

cakephp - "Can not buid tree with empty xml"在 cakephp 2.3.8 中使用 html2ps 时出错

postgresql - 如何将 CakePHP 连接到 Postgres 数据库?

Cakephp日期输入问题