gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:36 25 4
gpt4 key购买 nike

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

SQL 最终变成了这个

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

但是当我运行这个查询时要么返回

  • 0条记录
  • 1条记录
  • 2+条记录

问题是我总是需要返回 1 条记录;我可以在那里设置一个 LIMIT,但有时我什至得不到记录,而且我不需要这样做,因为 FLOOR(1 + rand() * 50) 将始终返回有效的行 ID。

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

<!-- 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);

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

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

设置 ID 表后,我继续运行第一个查询,记住 FLOOR(1 + rand() * 50) 总是返回范围内的有效 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() 对每一行进行评估(当从一个表中选择时)

如果你不想声明一个变量 -

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

DOC LINK

关于mysql - 有人可以解释为什么当我只期望 1 条记录时,这个查询有时会返回零行,而有时会返回多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45100301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com