如何:MySQL用user_id(RAND)按分页顺序排序

时间:2013-10-16 11:28:48

标签: php mysql session random sql-order-by

在单击下一页按钮时,寻找一种在数据库中保持用户表随机顺序的解决方案。

实际上我有一个拥有1000个用户的数据库,我希望每个页面显示10个用户(在成员列表中),我的查询如下所示:

$sql = "SELECT * FROM users ORDER BY user_id LIMIT 1,10";

现在我想ORDER BY RAND()并且它可以工作,当然除了当点击下一页时,它再次被洗牌,有时会发生相同的用户再次出现。

所以我的问题是关于保持我在第一页上的随机顺序的解决方案,也在下一页上。

当有人第一次使用洗牌后的数字从1到1000 访问成员列表时,我想设置$ _SESSION变量,然后按$ _SESSION变量中的位置对成员进行排序< strong>其中数字等于user_id 。

不知道这可能是怎么回事,但实际上我想象的解决方案如下:

$numbers = range(1, 1000);

$shuffled_numbers = shuffle($numbers);

$sort = $_SESSION['random_user_sort'] = $shuffled_numbers;

所以当点击第二页(下一页)时,我会有一个mysql查询:

$sql = "SELECT * FROM users ORDER BY $sort LIMIT 11,20";

任何让它以这种方式工作的解决方案或更好的想法?

1 个答案:

答案 0 :(得分:1)

RAND()函数并不真正生成随机数,而是所谓的随机数:数字是用确定性公式计算的,它们只是用于随机。要计算新数字,请使用前一个数字并应用公式,这就是我们如何使用确定性函数获得不同的输出:使用不同的输入。< / p>

我们使用的初始号码称为种子。如果您have a look at the manual,您会看到RAND()有一个可选参数:

  

RAND(), RAND(N)

     

返回0&lt; = v&lt;范围内的随机浮点值v。 1.0。 如果   指定了一个常量整数参数N,它用作种子   value,它产生可重复的列值序列

你现在可能已经想到了我想去的地方:

mysql> SELECT language_id, name FROM language ORDER BY RAND(33);
+-------------+----------+
| language_id | name     |
+-------------+----------+
|           3 | Japanese |
|           1 | English  |
|           4 | Mandarin |
|           6 | German   |
|           5 | French   |
|           2 | Italian  |
+-------------+----------+
6 rows in set (0.00 sec)

mysql> SELECT language_id, name FROM language ORDER BY RAND(33);
+-------------+----------+
| language_id | name     |
+-------------+----------+
|           3 | Japanese |
|           1 | English  |
|           4 | Mandarin |
|           6 | German   |
|           5 | French   |
|           2 | Italian  |
+-------------+----------+
6 rows in set (0.00 sec)

P.S。手册没有明确关于种子范围(它只是说整数),你可能需要一些额外的研究(或者只是一些快速测试)。