【问题标题】:Random and unique Mysql select query随机且唯一的 Mysql 选择查询
【发布时间】:2014-03-25 04:11:15
【问题描述】:

Mysql 数据库中有大约 90 个图片链接。然而,每一行的 ID 并不是真正按时间顺序排列的。例如,最初它从 6-20 开始,然后我删除了一些空白。然后它从 80 - 120 开始,然后是另一个差距等。

这是一个热门或不热门的网站。我希望用户能够浏览所有 90 张图像,而不必两次查看相同的图像。然而,目前这种情况经常发生。同一张图片会出现两次甚至三次。

这是我现在的选择查询:

$sql = mysql_query("SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `content`)  ORDER BY rand() LIMIT 1");

有没有人知道这个问题的更好解决方案?

【问题讨论】:

  • 查看WHERE() 子句。

标签: php mysql select unique


【解决方案1】:

您可以存储用户看到的“事物”的 ID,并在所有下一页中排除它们(通过加入或不加入)。通过这种方式,您始终可以获得随机帖子,而不会被数据库中行的顺序所困扰(如果用户稍后返回怎么办?)。

【讨论】:

  • 很好的解决方案,但我的网站不允许人们注册。我想我可以用 cookie 之类的来做到这一点
【解决方案2】:

如何从数据库中获取所有索引,将它们打乱,制作一个列表,然后将它们从一个页面传递到另一个页面,显示顶部的一个并将其从列表中删除?

【讨论】:

  • 我想我会用这个。但是,获取所有 id 并将它们放入会话中的数组中可能会有点慢。有更好的方法吗?
  • 没有办法告诉mysql记住你已经选择了什么。如果不读取您感兴趣的索引,您将无法做到这一点(即使您将信息存储在 db 而不是 session 中,您仍然需要先读取它们):/ 如果它只有 90 条记录,那么性能不应该是一个问题。
【解决方案3】:

您面临的问题是rand() 本身。每次调用它,它都会产生不同的顺序。 Random 是随机的,因此给定的行可能连续出现两次。您真正要寻找的是随机排列。

一种方法是随机的,种子后跟带有偏移量的limit

select *
from table t
order by rand(<seed value here>)
limit <offset>, 1;

您需要的两件事是种子值。为此,您只需为每个用户保留一个枚举值,或者使用用户 ID,或者每个用户的整数和常量。

您需要的另一件事是偏移量。这很重要,因为当您拿到第二件商品时,您需要确保顺序与第一件商品的顺序相同。

另一种方法是第一次以随机顺序获取所有 id 并将它们存储在应用程序中。您可以使用group_concat()

select group_concat(id order by rand())
from table t;

然后遍历这个列表而不是返回数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多