2014-02-23 58 views
2

我的Mysql数据库充满了大约90个图像链接。然而,每行的ID并不是按照时间顺序排列的。例如最初它从6到20然后是我删除了一些差距。然后它从80 - 120,然后又一个差距等。随机和唯一的Mysql select查询

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

这里是我的选择查询现在:

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

有谁知道这个问题没有更好的办法?

+0

查看一个'WHERE()'子句。 – Shahar

回答

0

您可以存储用户已经看到的“事物”的ID,并将其排除在所有下一页(通过连接或不在)中。通过这种方式,您可以随时获取随机文章,而不会被数据库中行的顺序卡住(以及如果用户稍后返回,该怎么办?)。

+0

好的解决方案,但我的网站不让人们注册。我想我可以用cookie或其他东西做到这一点 – idwes7

0

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

+0

我想我会用这个。但是,获取所有的id并将它们放入会话中的数组可能会有点慢。还有更好的方法吗? – idwes7

+0

没有办法告诉mysql记住你已经选择了什么。如果没有阅读你感兴趣的索引(即使你将信息存储在db而不是会话中,你仍然需要先阅读它们):/ 如果它只是90个记录,那么性能不应该成为一个问题。 – wesolyromek

0

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

一种方法是随机的种子,然后用limit偏移:

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

你需要这两样东西的种子值。您可以通过为每个用户保留一个枚举值,或者使用用户标识符,或者每个用户的一个整数和常量来做到这一点。

您需要的另一件事是抵消。这很重要,因为当你得到第二个项目时,你需要确保排序与第一个项目相同。

另一种方法是首次以随机顺序获取所有ID并将它们存储在应用程序中。您可以使用group_concat()做到这一点:

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

然后再通过这个列表,而不是返回到数据库。