在单击下一页按钮时,寻找一种在数据库中保持用户表随机顺序的解决方案。
实际上我有一个拥有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";
任何让它以这种方式工作的解决方案或更好的想法?
答案 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。手册没有明确关于种子范围(它只是说整数),你可能需要一些额外的研究(或者只是一些快速测试)。