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

时间:2019-05-20 16:30:06

标签: mysql sql

在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方面)。对这种令人困惑的情况的任何澄清将不胜感激。

2 个答案:

答案 0 :(得分:1)

 SELECT Id FROM Person GROUP BY Email

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

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

即返回任意选择的值。查询是否返回ID的{​​{1}} 1或3还是一个机会。

这说明了为什么您得到不同的结果。一次,DBMS一次选择此值。

答案 1 :(得分:0)

Group BY应该与聚合功能一起使用。

(如果您需要不同的结果,请使用DISTINCT子句,而不要错误地使用group by)

在mysql versone <5.7中,使用不带聚合功能的group by会产生不可预测的结果..

在mysql> = 5.7中默认是不允许的,这种使用会产生错误。

如果要基于分组控制结果,则应使用适当的聚合函数,例如:min()或max()

{  
   "fooArray":[  
      {  
         "plot":"circle",
         "color":"yellow",
      }
   ]
}