MySql 查询 return 随机行 return 意外的行数

MySql query to return a random row returns unexpected number of rows

我正在尝试从 MySql table 中的一长串单词中随机获取一个单词:word_list [id*|wword].

我的查询看起来是这样的:

SELECT * FROM word_list w where id = (SELECT FLOOR(1 + RAND()*(10-1)))

我认为上面的查询会 return 一个且只有一个 ID 介于 1 和 9 之间的随机行。

令我惊讶的是,它有时会 returns 0、1、2 或 3 行。这怎么可能?

它正在为每一行计算一个新的随机数。当随机表达式的结果与 id 匹配时,该行将包含在结果中。

这应该证明您的查询是如何工作的:

SELECT id, wword, FLOOR(1+RAND()*(10-1)) AS r FROM word_list;

这 return 每行都有一个不同的随机数(这也是您在 WHERE 子句中对随机表达式所做的)。有时随机数 returned 作为 r 在相应的行上等于 id。不经常,但偶尔。当这两个数字恰好相等时,即会在您的查询中 return 编辑一行。

您需要的是计算一个随机数一次。例如:

SELECT word_list.*
FROM (SELECT FLOOR(1+RAND()*(10-1)) AS id) AS r
CROSS JOIN word_list USING (id);

假设您的 table 保证每个 id 值在 1 到 10 之间有一行,这应该 return 恰好一行。

另一个解决方案可能是按 RAND() 排序而不是限制为 1。 如果您的 table 不太大,则此方法有效。

SELECT * FROM word_list ORDER BY RAND() LIMIT 1;