有人可以解释为什么当我只期望 1 条记录时,这个查询有时会返回零行,而有时会返回多行

Can someone explain why this query sometimes brings back zero rows other times multiple rows when I am only ever expecting 1 record

我正在尝试从 table 中获取单个随机行,为此我可以使用 FLOOR(1 + rand() * 50) 获取有效的行 ID。 50 等于我的 table 中的记录数量(我实际上有几千条,但作为示例,我保持这么小)。

SQL 变成了这个

<!-- language: lang-sql -->
SELECT id FROM ids WHERE id = FLOOR(1 + rand() * 50)

但是当我 运行 这个查询要么 returns

问题是我总是需要返回 1 条记录;我可以在那里放一个 LIMIT 但有时我什至没有得到记录而且我不需要因为 FLOOR(1 + rand() * 50) 总是 return 一个有效的行 ID。

我知道还有其他方法可以做到这一点,但现在我只需要了解为什么会这样。为了演示这里是我的例子 table

<!-- language: lang-sql -->
CREATE TABLE `ids` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

我再运行以下50次

<!-- language: lang-sql -->
INSERT INTO `ids` (`id`) VALUES (NULL);

所以现在我的 table 看起来像这样(但下面还有另外 48 条记录)

id |
---|
1  |
2  |
.
.

随着 ID 的 table 设置,我继续保持 运行ning 第一个查询,记住 FLOOR(1 + rand() * 50) 总是 return 范围内的有效 ID,我得到

id |
---|
25 |
30 |
43 |

id |
---|

id |
---|
41 |

声明您要查找的 ID 实际上可以解决这个问题。

SET @randomID = FLOOR(1 + rand() * 50); 
SELECT id FROM ids WHERE id = @randomID;

尽管我仍然不明白为什么我在原始查询中返回了超过 1 条记录。

标准文档说 -

WHERE 子句中的 RAND() 对每一行进行评估(当从一个 table 中选择时)

如果您不想声明变量 -

select id from `ids`
join (select FLOOR(1 + rand() * 50) as id) b using(id);

DOC LINK