所以,我想在MySQL数据库上进行查询,但是,我希望结果是随机的 - 也就是说,我不希望每次都以相同的顺序出现相同的事情。这是因为我只列出查询的前6项(或者在某些情况下是2项),我希望数据库的所有内容都有机会出现。
可以在MySQL中执行此操作,还是必须使用PHP来执行此操作?
答案 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)。在应用程序层执行此操作将涉及一些额外的编码,但您会发现它更灵活,因为您可以更新算法以满足您的最新业务需求,更不用说您可以实现缓存等优化。