有人可以解释为什么当我只期望 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
- 0条记录
- 1 条记录
- 2+ 条记录
问题是我总是需要返回 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);
我正在尝试从 table 中获取单个随机行,为此我可以使用 FLOOR(1 + rand() * 50)
获取有效的行 ID。 50 等于我的 table 中的记录数量(我实际上有几千条,但作为示例,我保持这么小)。
SQL 变成了这个
<!-- language: lang-sql -->
SELECT id FROM ids WHERE id = FLOOR(1 + rand() * 50)
但是当我 运行 这个查询要么 returns
- 0条记录
- 1 条记录
- 2+ 条记录
问题是我总是需要返回 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);