我正在尝试从数据不变的表中获取随机行。我读过有人尝试 ORDER BY RAND() ,这对于大型数据集来说很糟糕,并且不能很好地扩展。
我还看到了让 SQL 在最小/最大范围之间获取随机行的解决方案,如下所示: FLOOR(MAX(needed_id) * RAND) 但这仅在行是顺序的情况下才有效:1,2, 3,4,5,6,7,8,9,10。
我需要提取的数据不是连续的,例如:1,2,3,4,10,11,12,13
所以我认为有两种解决方案:
第一个解决方案: 继续运行:FLOOR(MAX(needed_id) * RAND)直到我收到正确类型的一行(1/6 机会)
第二种解决方案: 创建一个重复的表(因为我的数据永远不会改变),如下所示:
temp_id | needed_id | type
1 1 1
2 4 1
3 7 2
3 8 2
所以我可以使用这种方法提取一个随机 temp_id: FLOOR(MAX(temp_id) * RAND) - WHERE type = 1
你怎么看?我可能会运行第一个解决方案大约 6 次,直到我收到正确的行,但在第二个解决方案中它会立即工作,但需要另一个表。