我有一个图片数据库,我想让访问者浏览图片。我有一个“下一个”和一个“上一个”链接。
但我想要的是向每位访客展示图片的其他顺序。我怎样才能做到这一点?如果我将使用ORDER BY RANDOM(),我将有时会显示重复的图像。
是的,有人能帮帮我吗?谢谢!答案 0 :(得分:41)
您可以尝试在随机函数中使用种子:
SELECT something
FROM somewhere
ORDER BY rand(123)
答案 1 :(得分:4)
问题来自于每个页面将再次运行RAND()
并且无法知道之前是否已经返回了返回的图片。您必须以这样的方式撰写查询,以便过滤掉之前页面上已显示的图片,以便RAND()
可供选择的选项更少。
一个想法是随机化图片,选择ID,在会话中存储ID,然后使用这些ID SELECT
。这样,每个用户都会将图片随机化,但他们可以通过它们进行分页,而无需在每个页面上重新随机化。
所以,比如:
SELECT id FROM pictures ORDER BY RAND() LIMIT x
如果您在会话中没有ID SELECT ... FROM pictures WHERE id IN (IDs from session) LIMIT x
另一个想法是在会话中存储用户已经看到的ID并将其过滤掉。例如:
SELECT ... FROM pictures ORDER BY RAND() LIMIT x
如果会话不包含任何ID SELECT ... FROM pictures WHERE id NOT IN (IDs from session) ORDER BY RAND() LIMIT x
另一种方式似乎是使用种子,izi指出。我不得不说我不知道种子,但它似乎返回与种子完全相同的值完全相同的结果。因此,运行您的常规查询并使用RAND(seed)
而不是RAND()
,其中“seed”是唯一的字符串或数字。您可以将会话ID用作种子,因为它保证每个访问者都是唯一的。
答案 2 :(得分:2)
您可以按照izi的建议播种随机函数,或者按照rdineiu的建议跟踪访问过的图像与未访问过的图像。
我想强调的是,这两种方案都不会表现良好。要么引导您使用任意条件对整个表(或其感兴趣的部分)进行排序,并提取顶部n
行,可能带有偏移量。它会非常慢。
因此,请考虑一下每个访问者应该获得不同图像顺序的重要性。可能只要事情看起来是随机的, 就不重要了。假设是这种情况,请考虑这个替代方案......
在您的表格中添加额外的float
字段,将其称为sort_ord
。 在其上添加索引。在每次插入或更新时,为其分配一个随机值。这里的观点是最终得出一个看似随机的顺序(从访问者的角度来看)而不影响性能。
这样的设置将允许您抓取前n
行并使用索引对图像进行分页,而不是对整个表进行排序。
根据您的选择,让cron作业定期设置一个新值:
update yourtable
set sort_ord = rand();
另外,您可以选择创建多个此类字段,并在访问者访问您的网站时为其分配一个(Cookie或会话)。
答案 3 :(得分:1)
这将解决:
SELECT DISTINCT RAND() as rnd, [rest of your query] ORDER BY rnd;
答案 4 :(得分:1)
使用RAND(SEED)。从文档:“如果指定了一个常量整数参数N,它将用作种子值。”(http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand)。
在上面的示例中,结果顺序始终相同。您只需更改种子(351)即可获得新的随机顺序。
SELECT * FROM your_table ORDER BY RAND(351);
每次用户点击第一页时,您都可以更改种子。
答案 5 :(得分:-2)
没有看到SQL,我猜你可以尝试SELECT DISTINCT ...