MySQL查询中的一致随机排序

时间:2011-05-28 09:45:53

标签: mysql random

我有一个图片数据库,我想让访问者浏览图片。我有一个“下一个”和一个“上一个”链接。

但我想要的是向每位访客展示图片的其他顺序。我怎样才能做到这一点?如果我将使用ORDER BY RANDOM(),我将有时会显示重复的图像。

是的,有人能帮帮我吗?谢谢!

6 个答案:

答案 0 :(得分:41)

您可以尝试在随机函数中使用种子:

SELECT something FROM somewhere ORDER BY rand(123)

123是种子。 Random应该返回相同的值。

答案 1 :(得分:4)

问题来自于每个页面将再次运行RAND()并且无法知道之前是否已经返回了返回的图片。您必须以这样的方式撰写查询,以便过滤掉之前页面上已显示的图片,以便RAND()可供选择的选项更少。

一个想法是随机化图片,选择ID,在会话中存储ID,然后使用这些ID SELECT。这样,每个用户都会将图片随机化,但他们可以通过它们进行分页,而无需在每个页面上重新随机化。

所以,比如:

  1. SELECT id FROM pictures ORDER BY RAND() LIMIT x如果您在会话中没有ID
  2. 将ID存储在会话中
  3. SELECT ... FROM pictures WHERE id IN (IDs from session) LIMIT x
  4. 另一个想法是在会话中存储用户已经看到的ID并将其过滤掉。例如:

    1. SELECT ... FROM pictures ORDER BY RAND() LIMIT x如果会话不包含任何ID
    2. 将当前查询中的ID附加到会话
    3. SELECT ... FROM pictures WHERE id NOT IN (IDs from session) ORDER BY RAND() LIMIT x
    4. 另一种方式似乎是使用种子,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 ...