mySQL返回可能重复的随机行

时间:2013-11-04 17:47:53

标签: mysql random

我正在尝试随机化一定数量的行但是假设数据库中只有4行,我需要获得6个随机行我想要的可能性(即使表中有超过6行)生成重复的行。

这在mySQL中很容易实现吗?

我目前的查询是这样的:

SELECT * FROM winners ORDER BY RAND() LIMIT 6

这个想法是用户可以赢得不止一次。 :)

希望你能帮忙! !

4 个答案:

答案 0 :(得分:3)

SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1

答案 1 :(得分:3)

任何涉及ORDER BY RAND()的解决方案都不赞成,因为它不能使用索引,它基本上对整个表进行排序(可能会变得非常大)只是为了选择一行。

更好的解决方案是在MIN(id)和MAX(id)之间生成一个随机数,这是你选择的随机行。随着你的桌子越来越大,这将变得越来越大。

选择一个随机ID是非常有效的,我建议你一次只挑选六个随机ID,然后一次查找一行。因此,您有可能不止一次选择一行。

如果不保证您的所有ID都是连续的,您可以选择大于随机选择的第一个ID。所以在伪代码中:

$MIN, $MAX = SELECT MIN(ID), MAX(ID) FROM winners
FOR LOOP FROM 1 to 6
    $R = $MIN+RANDOM($MAX-$MIN)
    $WINNER[] = SELECT * FROM winners WHERE id >= $R LIMIT 1

答案 2 :(得分:1)

假设您至少有一行,您可以将行数相乘,然后从该放大的集合中随机返回:

SELECT w.*
FROM winners w cross join
     (select 1 as n union all select 2 union all select 3 union all select 4 union all
      select 5 union all select 6
     ) nums
ORDER BY RAND()
LIMIT 6;

答案 3 :(得分:0)

这个问题听起来像是XY问题。听起来你可能会问你问题的解决方案而不是你的问题。请参阅:https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem

我认为在应用程序中将四行变为六行可能会更好,而不是选择重复的行。