具有随机排序的 PHP MySQL 分页

2022-08-30 21:26:13

这是我网站上订购搜索结果的问题,

进行搜索时,随机结果将显示在内容页面上,此页面也包括分页。我用户跟随作为我的SQL查询。

SELECT * FROM table ORDER BY RAND() LIMIT 0,10;

所以我的问题是

  1. 我需要确保每次用户访问下一页时,他们已经看到的结果不会再次出现(在下一个查询中以内存有效的方式排除它们,但仍然按rand()排序)

  2. 每次访问者转到第1页时,都会有不同的结果集,是否可以对此使用分页,或者排序总是随机的。

  3. 我可以在MYSQL中使用种子,但是我不确定如何实际使用它.


答案 1

使用兰特(种子)。引用 docs:“如果指定了常量整数参数 N,则将其用作种子值。(http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand)。

在上面的示例中,结果顺序是兰特,但它始终是相同的。您只需更改种子即可获得新订单。

SELECT * FROM your_table ORDER BY RAND(351);

您可以在每次用户点击第一个结果页面时更改种子,并将其存储在用户会话中。


答案 2

MySQL中的随机排序是一个棘手的问题。过去,我通常选择尽可能解决问题。通常,用户永远不会多次或两次返回这样的一组页面。因此,这使您有机会避免所有各种令人作呕的随机顺序实现,而支持几个简单但并非100%随机的解决方案。

解决方案 1

从已编制索引以进行排序的多个现有列中进行选择。这可以包括创建于、修改的时间戳或您可以作为排序依据的任何其他列。当用户第一次来到网站时,将它们放在一个数组中,随机选择一个,然后随机选择或。ASCDESC

在你的例子中,每次用户回到第1页时,选择一些新的东西,将其存储在会话中。每个后续页面,都可以使用该排序生成一组一致的分页。

解决方案 2

您可以有一个额外的列来存储用于排序的随机数。显然,它应该被索引。定期运行以下查询;

更新表 SET rand_col = RAND();

这可能不适用于您的规范,因为您似乎要求每个用户每次点击第1页时都看到不同的东西。


推荐