基于会话的随机查询结果

| 我有一个配置文件表,我希望以随机顺序列出列表配置文件,如下所示:
$this->paginate = array(\'User\' => array(\'conditions\'=>array(\'User.userstanding_id\'=>\'1\'), \'order\' => \'RAND()\', \'limit\' => \'10\')); 
唯一缺少的功能是,我希望这些配置文件按顺序进行,以便在下一页上没有重复项,即使在所有页面上进行浏览时,甚至某些配置文件都不会被查看。 我正在寻找的是一种为查询找到随机起点,然后从该起点按顺序分页的方法。也许每个会话?
已邀请:
MySQL的“ 1”函数可以使用整数作为自变量来用作种子,总是产生相同的结果: 为了说明这一点,这是一个包含3个单列字符串记录的表:
mysql> select * from chartest;
+--------+
| string |
+--------+
| AA     |
| AB     |
| BB     |
+--------+
3 rows in set (0.00 sec)
如果我在
ORDER BY
中将as3ѭ用作种子值,它将始终产生相同的结果顺序:
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)
选择你的种子 您可以将用户的会话ID转换为整数,然后将其传递给此函数,以便对于该会话,结果始终以相同的方式排序。 例如,如果会话ID是MD5哈希,则为了避免必须处理这些值表示的大(160位)整数,只需从字符串中去除字符(例如使用“ 7”)。然后取前5位左右的数字并将其转换为
(int)
以用作您的种子:
$seed = substr($numeric_id, 0, 5);
更新资料 若要在使用CakePHP时将参数传递给
RAND()
函数,以确保将其视为整数而不是字符串,请尝试在
$conditions
数组的
order
中使用以下语法:
\'order\' => \'RAND(CAST(\'.$seed.\' AS SIGNED))\' 

bab

我不是CakePHP的专家,但是我想如果您在会话基础上为RAND函数添加种子,那么分页功能将使用会话种子值在页面之间运行。 例如 在创建会话时分配种子,只需使用随机数生成器即可。
 $this->paginate = array(\'User\' => array(\'conditions\'=>array(\'User.userstanding_id\'=>\'1\'), \'order\' => \'RAND(\'.$_SESSION[\'rndSeed\'].\')\', \'limit\' => \'10\'));

要回复问题请先登录注册