2013-11-04 31 views
1

我试图随机化一定数量的行,但可以说只有4行在数据库中,我需要得到6个随机行我想可能性(即使有更多比表中的6行)产生重复的行。mySQL返回可能重复的随机行

在mySQL中这很容易实现吗?

我当前的查询是这样的:

SELECT * FROM winners ORDER BY RAND() LIMIT 6 

的想法是,用户可以赢得一次以上。 :)

希望你能帮助! !

回答

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 
+0

如果我们有ID [1,2,3,4,5,1000],则1000有更大的选择机会。 – mpen

+0

如果完美的统计信息是绝对必要的,那么可以使用sql server的内部rowid。 – MickLH

+0

@MichLH,MySQL没有内部rowid,至少没有一个可以查询。可以使用另一个表格并用连续的整数填充,并映射到原始表格中的ID值。 –

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 
+0

。 。 downvotes似乎是随机的恶意。 –

+0

我阻止了一位在聊天中对我感到相当烦恼的用户,我怀疑他以这种方式报复,但无法确定。 – Sir

+0

@Dave:你*可以确定。去他的个人资料,然后去他的投票选项卡。 – mpen

0

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

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

+0

如果只有4人进入,但必须有6场胜利。那我怎么把四行变成六行呢?它的数据重复在我试图避免的数据库中。 – Sir

+1

我认为最好在应用程序中解决这个问题,而不是从数据库中选择重复的行。没有?在应用程序中创建重复项,而不是在选择查询中修改结果。 – Anthony

+0

'create duplicates'在数据库中是一个高效的数据库结构的完全相反;) – Sir

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; 
+0

你能解释一下这是干什么的吗?是否暂时将表中的所有行加倍并从中选择? – Sir

+0

@Dave。 。 。在这种情况下,“交叉连接”将行数乘以六(因为'nums'表中有六行)。然后从这些放大的结果中随机选择。 –

+0

假设'ORDER BY RAND()'是'O(n log n)',这个解决方案是'O(6n log 6n)',而我的解决方案是'O(6(n log n))',对吗? – Barmar