随机而独特的Mysql选择查询

时间:2014-02-23 17:35:29

标签: php mysql select unique

我的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");

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如何从数据库获取所有索引,对它们进行混洗,制作列表,然后将它们从一个页面传递到另一个页面,显示最上面的一个并从列表中删除它?

答案 2 :(得分:0)

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

一种方法是随机的,种子后跟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;

然后浏览此列表而不是返回数据库。