我有一个查询,旨在从结果集中检索随机行。我不想使用ORDER BY Rand()
,因为它似乎效率很低。
我的方法如下:
- 生成 [0,1) 之间的单个随机数
- 给结果查询的每一行一个唯一的“排名”数字。即给第一行一个值1,第二行一个值2,依此类推
- 使用随机数获得一个介于 1 和结果中的行数之间的数字
- 返回 rank == 从随机数生成的数字所在的行
示例查询:
SELECT * FROM(
(SELECT @rand := RAND(), @rank := 0) r1
CROSS JOIN
(SELECT (@rank:=@rank+1) as num, A.id FROM
A JOIN B
ON A.id = B.id
WHERE B.number = 42
)
WHERE num = FLOOR(1 + @rand * @rank) LIMIT 1
这适用于检索一行,但我想要 10 个随机行。更改LIMIT 1
为LIMIT 10
不起作用,因为如果num + 10 > number of rows
查询不返回 10 行。
我能想到的唯一解决方案是在 sql 查询中生成 10 个随机数,检查它们彼此不同并且有几WHERE num = random_number_1
行。或者,我可以调用该查询 10 次,检查所选行是否唯一。我不知道如何做前者,而后者似乎效率很低。除非可能有一些很棒的缓存可以使相同的查询运行得非常快?
有没有人有任何想法?谢谢你