2

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

这在 mySQL 中很容易实现吗?

我当前的查询是这样的:

SELECT * FROM winners ORDER BY RAND() LIMIT 6

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

希望你能帮忙!!

4

4 回答 4

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
于 2013-11-04T19:25:53.180 回答
2
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
于 2013-11-04T17:51:25.270 回答
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;
于 2013-11-04T17:56:43.730 回答
0

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

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

于 2013-11-04T17:54:46.807 回答