我正在尝试随机化一定数量的行,但假设数据库中只有 4 行,我需要获得 6 个随机行我希望有可能(即使表中有超过 6 行)产生重复行。
这在 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
假设您至少有一行,您可以将行数相乘,然后从该扩大的集合中随机返回:
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;
这个问题听起来可能是 XY 问题。听起来您可能在询问问题的解决方案,而不是您的问题。请参阅:https ://meta.stackexchange.com/questions/66377/what-is-the-xy-problem
我认为在您的应用程序中将四行变为六行可能会更好,而不是选择重复的行。