所以,我想在MySQL数据库上查询,但是,我希望结果是随机的 - 也就是说,我不希望每次都以相同的顺序出现相同的结果。这是因为我只会列出查询的前6个项目(或者在某些情况下是2个项目),并且我希望数据库的所有内容都有机会出现。随机MySQL查询?或者随机化一个结果?
是否有可能在MySQL中做到这一点,或者我必须使用PHP来做到这一点?
所以,我想在MySQL数据库上查询,但是,我希望结果是随机的 - 也就是说,我不希望每次都以相同的顺序出现相同的结果。这是因为我只会列出查询的前6个项目(或者在某些情况下是2个项目),并且我希望数据库的所有内容都有机会出现。随机MySQL查询?或者随机化一个结果?
是否有可能在MySQL中做到这一点,或者我必须使用PHP来做到这一点?
对于一个快速的方法试试这个:
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
...你可以检索随机顺序排这样的:
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。这样可以避免扫描整个表格。
这涉及全表扫描和大数据集是性能杀手 –
@Darhazer:是的,你说得对,前两种方法需要表扫描。第三个不是,但它不是一个通用的解决方案。你有更好的答案吗?如果是这样,请发布它,以便OP可以得到一些更好的解决方案! –
马克拜尔斯是正确的这已被问过。
你想把你的随机算法放在应用层vs数据库层。数据库层(假设MySQL)有巨大的性能影响。在应用程序层执行此操作将涉及一些额外的代码,但您会发现它更加灵活,因为您可以更新算法以适应最新的业务需求,更不用说可以实现缓存等优化。
我很肯定这是重复的。 –
因此,无论如何你都在回答问题,只有非高性能答案? – Konerak
@Konerak:如果你知道另一种性能更好的方法,请*帮助* OP并发布它,而不是仅仅抱怨其他尝试*帮助*的人。 –