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.”)。但你对我兰德问题的最初回答非常有效。