2011-11-29 88 views
1

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

是否有可能在MySQL中做到这一点,或者我必须使用PHP来做到这一点?

+0

我很肯定这是重复的。 –

+0

因此,无论如何你都在回答问题,只有非高性能答案? – Konerak

+0

@Konerak:如果你知道另一种性能更好的方法,请*帮助* OP并发布它,而不是仅仅抱怨其他尝试*帮助*的人。 –

回答

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()并不意味着是ap错误的随机生成器。这是一种快速生成随需数据的方式,可以在相同MySQL版本的平台之间移植。


如果你有独特的id场是从1更在[1,N]选择六张随机数和获取的六排与增加为n,而不可以提高性能的任何差距IDS。这样可以避免扫描整个表格。

+2

这涉及全表扫描和大数据集是性能杀手 –

+0

@Darhazer:是的,你说得对,前两种方法需要表扫描。第三个不是,但它不是一个通用的解决方案。你有更好的答案吗?如果是这样,请发布它,以便OP可以得到一些更好的解决方案! –

0

马克拜尔斯是正确的这已被问过。

你想把你的随机算法放在应用层vs数据库层。数据库层(假设MySQL)有巨大的性能影响。在应用程序层执行此操作将涉及一些额外的代码,但您会发现它更加灵活,因为您可以更新算法以适应最新的业务需求,更不用说可以实现缓存等优化。