如何解决基于会话的随机查询结果
| 我有一个配置文件表,我希望以随机顺序列出列表配置文件,如下所示:$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,5);
更新资料
若要在使用CakePHP时将参数传递给RAND()
函数,以确保将其视为整数而不是字符串,请尝试在$conditions
数组的order
中使用以下语法:
\'order\' => \'RAND(CAST(\'.$seed.\' AS SIGNED))\'
,我不是CakePHP的专家,但是我想如果您在会话基础上为RAND函数添加种子,那么分页功能将使用会话种子值在页面之间运行。
例如
在创建会话时分配种子,只需使用随机数生成器即可。
$this->paginate = array(\'User\' => array(\'conditions\'=>array(\'User.userstanding_id\'=>\'1\'),\'order\' => \'RAND(\'.$_SESSION[\'rndSeed\'].\')\',\'limit\' => \'10\'));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。