gpt4 book ai didi

mysql - 子查询返回的结果与单独调用时不同

转载 作者:行者123 更新时间:2023-11-29 07:21:17 25 4
gpt4 key购买 nike

在 MySQL 子查询中使用 GROUP BY 返回的结果在单独调用 GROUP BY 查询时不会出现。

这个例子已经尽可能精简了。

我觉得我遗漏了一些关于在子查询中使用 GROUP BY 的基本知识,但还没有找到解决这个特定问题的现有问题或教程。

首先,建表:

CREATE TABLE Person (
Id INT
Email VARCHAR(20)
);

INSERT INTO Person VALUES (1, "a@b.com");
INSERT INTO Person VALUES (2, "c@d.com");
INSERT INTO Person VALUES (3, "a@b.com");
INSERT INTO Person VALUES (5, "c@d.com");
INSERT INTO Person VALUES (7, "e@f.com");
INSERT INTO Person VALUES (11, "e@f.com");
INSERT INTO Person VALUES (13, "g@h.com");

现在比较这两对查询:

测试 1:使用显式 ID 的子查询

SELECT Id FROM Person WHERE Id IN (1, 2, 7, 13)

返回 Id (1, 2, 7, 13)

SELECT Id FROM Person WHERE Id IN (SELECT Id FROM Person WHERE Id IN (1, 2, 7, 13))

返回 Id (1, 2, 7, 13)

测试 2:使用 GROUP BY 的子查询以获得电子邮件的唯一性(在每个组中给出第一个)

SELECT Id FROM Person GROUP BY Email

返回 Id (1, 2, 7, 13)

SELECT Id FROM Person WHERE Id IN (SELECT Id FROM Person GROUP BY Email)

返回 Id (1, 2, 3, 5, 7, 11, 13)... 而不是预期的 (1, 2, 7, 13)。

我希望这两个测试的复合查询输出是编号 (1, 2, 7, 13)因为每个输出中的子查询编号 (1, 2, 7, 13)作为顶级查询的输入。

这让我相信显示的结果实际上并不是完整的结果(至少,当涉及到 GROUP BY 时)。对于这种令人困惑的情况,任何解释都将不胜感激。

最佳答案

 SELECT Id FROM Person GROUP BY Email

根据 SQL 标准,此查询无效。您按 Email 分组。因此,每个 Email 都会得到一个结果行。然后您想显示 Email 的 ID。但是每个 Email 都没有 ID,可以有很多。例如,对于 Email = 'a@b.com',有 ID 1 和 3。DBMS 应该会报错。但是 MySQL 默默地用

代替了它
 SELECT ANY_VALUE(Id) FROM Person GROUP BY Email

即返回任意选择的值。查询为 Email = 'a@b.com' 返回 ID 1 还是 3 是随机的。

这解释了为什么您会得到不同的结果。 DBMS 一次选择此值,另一次选择此值。

关于mysql - 子查询返回的结果与单独调用时不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56224881/

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