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