首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有随机排序的PHP MySQL分页

具有随机排序的PHP MySQL分页
EN

Stack Overflow用户
提问于 2012-05-24 00:21:31
回答 5查看 15.3K关注 0票数 18

这是在我的网站上排序搜索结果的一个问题,

进行搜索时,内容页上会出现随机结果,此页面也包含分页。用户跟随我的SQL查询。

代码语言:javascript
运行
复制
SELECT * FROM table ORDER BY RAND() LIMIT 0,10;

所以我的问题是

  1. 我需要确保每次用户访问下一页时,他们已经看到的结果不再出现(在下一个查询中排除它们,以内存高效的方式,但仍然按rand()排序)。
  2. 每次访问第一页时,都会有不同的结果集,是否可以使用分页,或者排序总是随机的。
  3. 我可以在MYSQL中使用种子,但是我不知道如何实际使用它。
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-24 02:55:10

MySQL中的随机排序是一个棘手的问题。在过去,我通常选择尽可能地绕开这个问题。通常,用户不会不止一次或两次返回这样的一组页面。因此,这让您有机会避免所有各种令人讨厌的随机顺序实现,而更倾向于一对简单但不是100%的随机解决方案。

解决方案1

从许多已编入索引以进行排序的现有列中选择。这可以包括在上面创建、修改的时间戳或任何其他可以排序的列。当用户第一次访问站点时,在数组中使用这些工具,随机选择一个,然后随机选择ASCDESC

在您的示例中,每次用户返回第1页时,选择新的内容,将其存储在会话中。每一个后续页面,都可以使用该类型生成一组一致的分页。

解决方案2

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

更新表集rand_col = RAND();

这可能不适用于您的规范,因为您似乎要求每个用户每次访问第1页时都要看到不同的内容。

票数 16
EN

Stack Overflow用户

发布于 2014-05-17 02:01:34

使用RAND(种子)。引用docs:“如果指定了常量整数参数N,则将其用作种子值。”(兰德)。

在上面的示例中,结果顺序是rand,但始终是相同的。你只需改变种子就能得到新的订单。

代码语言:javascript
运行
复制
SELECT * FROM your_table ORDER BY RAND(351);

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

票数 56
EN

Stack Overflow用户

发布于 2012-05-24 00:30:31

首先,您应该停止使用ORDER语法。这将对大行集的性能造成不良影响。

您需要手动确定限制约束。如果您仍然希望使用随机结果,并且不希望用户在下一页看到相同的结果,则唯一的方法是将此搜索会话的所有结果保存在数据库中,并在用户导航到下一页时操作这些信息。

在网页设计中,你应该理解的下一件事--在你的网站上使用任意的随机数据块,对用户的视觉感知非常、非常、非常糟糕。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10729633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档