返回随机行的MySql查询返回意外的行数

1 人关注

我试图从MySql表中的一长串单词中获得一个随机的单词: word_list [id*|wword]

我的疑问目前看来是这样的。

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

我以为上面的查询会返回一条且只有一条Id在1到9之间的随机行。

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

mysql
sql
database
random
mysql-select-db
Muleskinner
Muleskinner
发布于 2022-03-19
2 个回答
Bill Karwin
Bill Karwin
发布于 2022-03-19
已采纳
0 人赞同

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

这应该证明你的查询是如何工作的。

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

这将在每一行上返回一个不同的随机数(这也是你在WHERE子句中使用随机表达式的目的)。有时,作为r返回的随机数等于各自行的id。不是经常,但偶尔会有。当这两个数字碰巧相等时,这时就会在你的查询中返回一条记录。

而你需要的是计算一次随机数。比如说。

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