我试图随机化一定数量的行,但可以说只有4行在数据库中,我需要得到6个随机行我想可能性(即使有更多比表中的6行)产生重复的行。mySQL返回可能重复的随机行
在mySQL中这很容易实现吗?
我当前的查询是这样的:
SELECT * FROM winners ORDER BY RAND() LIMIT 6
的想法是,用户可以赢得一次以上。 :)
希望你能帮助! !
我试图随机化一定数量的行,但可以说只有4行在数据库中,我需要得到6个随机行我想可能性(即使有更多比表中的6行)产生重复的行。mySQL返回可能重复的随机行
在mySQL中这很容易实现吗?
我当前的查询是这样的:
SELECT * FROM winners ORDER BY RAND() LIMIT 6
的想法是,用户可以赢得一次以上。 :)
希望你能帮助! !
任何涉及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
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
这个问题听起来像可能是XY问题。这听起来像你可能会问你的问题的解决方案,而不是你的问题。请参阅:https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem
我认为在您的应用程序中将四行改为六可能更好,而不是选择重复的行。
假设你至少有一个排,你可以乘行数,然后从放大组随机返回:
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;
如果我们有ID [1,2,3,4,5,1000],则1000有更大的选择机会。 – mpen
如果完美的统计信息是绝对必要的,那么可以使用sql server的内部rowid。 – MickLH
@MichLH,MySQL没有内部rowid,至少没有一个可以查询。可以使用另一个表格并用连续的整数填充,并映射到原始表格中的ID值。 –