随机MySQL查询?或随机化结果?

时间:2011-11-29 17:31:05

标签: php mysql random

所以,我想在MySQL数据库上进行查询,但是,我希望结果是随机的 - 也就是说,我不希望每次都以相同的顺序出现相同的事情。这是因为我只列出查询的前6项(或者在某些情况下是2项),我希望数据库的所有内容都有机会出现。

可以在MySQL中执行此操作,还是必须使用PHP来执行此操作?

2 个答案:

答案 0 :(得分:1)

对于快速方法,请尝试以下方法:

SELECT  *
FROM    (
        SELECT  @cnt := COUNT(*) + 1,
                @lim := 10
        FROM    t_random
        ) vars
STRAIGHT_JOIN
        (
        SELECT  r.*,
                @lim := @lim - 1
        FROM    t_random r
        WHERE   (@cnt := @cnt - 1)
                AND RAND(20090301) < @lim / @cnt
        ) i

有关其工作原理的详细说明,请参阅此文章:


更简单(但速度慢)的方法是使用ORDER BY RAND()

 SELECT *
 FROM yourtable
 ORDER BY RAND()
 LIMIT 6

来自the manual

  

...您可以按照随机顺序检索行:

mysql> SELECT * FROM tbl_name ORDER BY RAND();
     

ORDER BY RAND()结合LIMIT对于从一组行中选择随机样本非常有用:

mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d
    -> ORDER BY RAND() LIMIT 1000;
     

RAND()并不是一个完美的随机发生器。这是一种快速生成按需随机数的方法,可以在同一MySQL版本的平台之间移植。


如果你有一个独特的id字段,从1增加到n没有任何间隙,你可以通过在[1,n]中选择六个随机数并用这些id获取六行来提高性能。这样可以避免扫描整个表格。

答案 1 :(得分:0)

马克·拜尔斯之前的问题是正确的。

您希望将随机算法放在应用程序层与数据库层之间。在数据库层有一个巨大的性能损失(假设MySQL)。在应用程序层执行此操作将涉及一些额外的编码,但您会发现它更灵活,因为您可以更新算法以满足您的最新业务需求,更不用说您可以实现缓存等优化。