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


How to: MySQL order by user_id (RAND) with pagination

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

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

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

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

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

我想过在有人第一次访问成员列表时设置一个 $_SESSION 变量,其中有从 1 到 1000 的随机数字,然后在 $_SESSION 变量中按位置对成员进行排序,其中数字等于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";

有什么解决方案可以让它以这种方式工作,甚至更好的想法?

RAND()函数并不真正生成随机数,而是所谓的随机数:数字是用确定性公式计算的,它们只是为了看起来随机。要计算一个新数字,你取前一个数字并对其应用公式,这就是我们通过确定性函数获得不同输出的方式:通过使用不同的输入

我们使用的初始数字称为种子。如果你看一下手册,你会发现RAND()有一个可选的参数:

RAND(), RAND(N)

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

你现在可能已经知道我想去哪里了:

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)

附言手册没有明确说明种子范围(它只是说整数),您可能需要一些额外的研究(或只是一些快速测试)。