PHP MySQL随机排序分页
在我的网站上订购搜索结果时出现问题 进行搜索时,内容页上会出现随机结果,此页也包括分页。我将用户跟踪作为我的SQL查询PHP MySQL随机排序分页,php,mysql,Php,Mysql,在我的网站上订购搜索结果时出现问题 进行搜索时,内容页上会出现随机结果,此页也包括分页。我将用户跟踪作为我的SQL查询 SELECT * FROM table ORDER BY RAND() LIMIT 0,10; 所以我的问题是 我需要确保每次用户访问下一页时,他们已经看到的结果不会再次出现(在下一次查询中排除它们,以节省内存的方式,但仍按rand()排序) 每次访问者进入第1页时,都会有不同的结果集,是否可以使用分页,或者排序总是随机的 我可以在MYSQL中使用seed,但是我不知道如何实
SELECT * FROM table ORDER BY RAND() LIMIT 0,10;
所以我的问题是
首先,应该停止使用ORDER BY RAND语法。这将对大量行的性能造成不利影响 您需要手动确定限制约束。如果您仍然希望使用随机结果,并且不希望用户在下一页上看到相同的结果,唯一的方法是将此搜索会话的所有结果保存在数据库中,并在用户导航到下一页时处理此信息
在网页设计中,你应该了解的下一件事是——在你的网站上使用任何随机数据块对用户的视觉感知都是非常、非常、非常有害的 我会让您的PHP生成要检索的随机记录编号或行,将这些编号或行传递给您的查询,并在用户的客户端上保存一个cookie,指示他们已经看到了哪些记录
没有理由让特定于用户的数据存在于服务器上(除非您正在跟踪它,但它是随机的,所以谁在乎呢)。您有几个问题要处理!我建议你一步一步走 第一期:他们已经看到的结果不会再次出现
id
)SELECT * FROM table WHERE id NOT IN (1, 14, 25, 645) ORDER BY RAND() LIMIT 0,10;
这样做的目的是匹配所有不是1、14、25或645的id
就性能问题而言:以节省内存的方式 显示第0-9行(共10行,查询耗时0.0004秒) 和
SELECT *
FROM table
WHERE id NOT
IN ( 1, 14, 25, 645 )
ORDER BY RAND( )
LIMIT 0 , 10
显示第0-9行(共10行,查询耗时0.0609秒)
因此,不要使用ORDER BY RAND(),最好使用SELECT RAND()。
几行(约MySQL中的随机排序是一个非常棘手的问题。过去,我通常选择尽可能绕过这个问题。通常,用户不会多次返回这样的一组页面。因此,这给了您避免fa中各种令人厌恶的随机排序实现的机会一对简单但不完全是100%随机的解 解决方案1 从已编制索引以进行排序的多个现有列中进行选择。这可以包括“创建日期”、“修改时间戳”或任何其他您可以排序的列。当用户第一次访问站点时,将这些列放在一个数组中,随机选择一个,然后随机选择
ASC
或DESC
在您的情况下,每次用户返回第1页时,选择新的内容,将其存储在会话中。在随后的每个页面中,您都可以使用该排序生成一组一致的分页
解决方案2
您可以有一个额外的列来存储用于排序的随机数。显然,它应该被索引
更新表集rand_col=rand()
这可能不适用于您的规格,因为您似乎要求每个用户在每次访问第1页时看到不同的内容。使用RAND(SEED)。引用文档:“如果指定了常量整数参数N,则将其用作种子值。”()
在上面的例子中,结果顺序是rand,但总是一样的。你可以改变种子来获得一个新的顺序
SELECT * FROM your_table ORDER BY RAND(351);
您可以在用户每次点击第一个结果页面时更改种子并将其存储在用户会话中。将所有结果拉入一个数组,然后在其中使用它们。您可能应该知道
ORDER BY RAND()
本身的性能很差。它直接指示MySQL选择每一行,给每一行分配一个随机数,并根据该数字对行进行排序。不要使用它。这意味着什么,“网页设计中的下一件事——任何随机数据块都非常非常不利于用户的视觉外观。”这意味着网站上的所有可视块或数据必须符合特定的依赖关系(模型逻辑、时间、访问级别等),但不能随机。想象一下,用户打开页面,看到一些随机块。“哇,酷块,很有趣,好吧,去喝茶吧。”几分钟后,他回来刷新页面。“天哪,我的酷块在哪里,太有趣了”。这可能有点像一个随机的推特提要或其他东西。你不能普遍地说随机性是不好的,如果它是一个有效的URL,回击按钮会保留预呈现的状态。是的,像推特提要这样的信息(数百万条推特,非常大的数据集)可以用随机数显示,这是真的。但搜索结果必须以给定的特定非随机顺序显示。这是一个比公认的更好的解决方案。谢谢!)是的,但是这个解决方案在大型数据库上的速度非常慢。这有效地为数据库中的每一行生成一个随机数,并在每个查询上对整个表进行排序。现在肯定是一个可扩展的解决方案。不可能在itExcell中使用索引
SELECT * FROM your_table ORDER BY RAND(351);