首页 > 解决方案 > 子查询返回的结果与单独调用时不同

问题描述

在 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)。

我预计这两个测试中复合查询的输出都是 Id (1, 2, 7, 13),因为每个输出中的子查询都输出 Id (1, 2, 7, 13) 作为顶级查询的输入。

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

标签: mysqlsql

解决方案


 SELECT Id FROM Person GROUP BY Email

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

 SELECT ANY_VALUE(Id) FROM Person GROUP BY Email

即返回一个任意选择的值。ID查询是否返回1 或 3是由机会决定的Email = 'a@b.com'

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


推荐阅读