我正在尝试从 SQL 查询的结果中获取随机行。
我的查询如下
SET @rank = 0;
SELECT * FROM(
SELECT (@rank:=@rank+1) AS num, ...
FROM ...
WHERE ....) as raw
WHERE raw.num = FLOOR(1 + (RAND() * @rank)) LIMIT 1
一般的想法是内部查询结果中的表的每一行都被赋予一个唯一的数字(num)。我已经手动检查确实是这种情况,并且每一行都有编号。
最后一行让我很痛苦。就目前而言,WHERE num = FLOOR(1 + (RAND() * @rank)) LIMIT 1
正在返回我想要的 - 只有一半的时间。它似乎返回正确范围内的随机行(例如,我正在测试查询是 0-1299)。但是,每三个查询中就有一个绝对不会返回任何内容。
好的,所以我认为这可能是一个双精度问题,所以我尝试使用>=
如下WHERE num >= FLOOR(1 + (RAND() * @rank)) LIMIT 1
:这种情况下的结果让我感到困惑。使用此代码,我总是得到一个结果,但返回的行数总是 < 100。
因此,如果我们调用 FLOOR(1 + (RAND() * @rank)) x
。当我使用=
而不是>=
它确认x
必须(在某些情况下)等于大于 1000 的数字时。但是,当使用 时>=
,满足条件的事实意味着 x 必须始终小于 100?
这是怎么回事?或者我还能如何解决我的问题