我有一个配置文件表,我想以随机顺序列出配置文件,我已经完成了这样的操作:
$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/