Mysql 基于会话的随机查询结果
我有一个配置文件表,我希望以随机顺序列出配置文件,我已经这样完成了:Mysql 基于会话的随机查询结果,mysql,cakephp,cakephp-1.3,Mysql,Cakephp,Cakephp 1.3,我有一个配置文件表,我希望以随机顺序列出配置文件,我已经这样完成了: $this->paginate = array('User' => array('conditions'=>array('User.userstanding_id'=>'1'), 'order' => 'RAND()', 'limit' => '10')); 唯一缺少的功能是,我希望配置文件按顺序进行,这样在下一页上就不会有重复的配置文件,甚至当您浏览所有页面时,某些配置文件也不会被查看
$this->paginate = array('User' => array('conditions'=>array('User.userstanding_id'=>'1'), 'order' => 'RAND()', 'limit' => '10'));
唯一缺少的功能是,我希望配置文件按顺序进行,这样在下一页上就不会有重复的配置文件,甚至当您浏览所有页面时,某些配置文件也不会被查看
我要寻找的是一种为查询找到随机起始点的方法,然后从该起始点开始按顺序分页。也许每节课 MySQL可以将整数作为参数用作种子,始终生成相同的结果:
为了演示这一点,这里有一个表,其中包含3条单列字符串记录:
mysql> select * from chartest;
+--------+
| string |
+--------+
| AA |
| AB |
| BB |
+--------+
3 rows in set (0.00 sec)
如果我使用1作为我的ORDER BY
中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)
选择你的种子
您可以将用户的会话ID转换为整数,并将其传递给此函数,以便对于该会话,结果总是以相同的方式排序
例如,如果会话ID是MD5散列,为了避免处理这些值所表示的大(160位)整数,只需从字符串中删除字符(例如使用preg_-replace('/[^\d\s]/','.$sessionid);
)。然后将前5位左右的数字转换为(int)
,用作种子:
$seed = substr($numeric_id, 0, 5);
更新
要在使用CakePHP时将参数传递给RAND()
函数,确保将其视为整数而不是字符串,请尝试在$conditions
数组的顺序中使用以下语法:
'order' => 'RAND(CAST('.$seed.' AS SIGNED))'
我不是CakePHP方面的专家,但我认为如果您在会话的基础上对RAND函数进行种子设定,那么paginate函数将使用会话种子值在页面之间工作
e、 g
在创建会话时分配种子,只需使用随机数生成器即可
$this->paginate = array('User' => array('conditions'=>array('User.userstanding_id'=>'1'), 'order' => 'RAND('.$_SESSION['rndSeed'].')', 'limit' => '10'));
cake通过rand(`3`)
并抛出错误将查询转换为此顺序。我并没有加上“蛋糕是自动的”。我假设这就是错误的来源。。。有什么想法吗?很抱歉在3中有一些技巧…我通常建议将整数存储在类型为(int)
的适当PHP变量中,并对其进行绑定,而不是将其串联,但由于您使用的是cake,试着按照我上面的更新传递它。很高兴听到:)我不知道为什么Cake决定把你的int
变成char
但是-这不完全是“有用的行为”。不,呵呵,一点帮助都没有。。。事实上,我必须增加空间才能绕过它。”(“.$seed.”)变成了“(“.$seed.”)。但你对我兰德问题的最初回答非常有效。