1

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

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

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

现在我想 ORDER BY 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";

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

4

1 回答 1

2

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

我们使用的初始数字称为种子。如果您查看手册,您会看到它 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)

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

于 2013-10-16T11:55:13.950 回答