我的MySQL查询中的错误分组

时间:2017-05-18 21:35:15

标签: mysql sql database

我想显示按ONLY城市分组的购买金额。但我希望以这种方式显示结果:city - >国家 - >量。就像这样:

Alabama Birmingham 80
Alabama Montgomery 100

所以我写这个查询:

select state, city, count(*) from address 
inner join person inner join purchase
where purchase.person_FK = person.id and address.person_FK = person.id
group by city
order by state, city;

但后来我收到了这个错误:“错误代码:1055. SELECT列表的表达式#1不在group by子句中,并且包含nonaggregate列'v2.address.state',这在功能上不依赖于group by子句中的列这与sql_mode = only_full_group_by“

不兼容

你们能帮助我吗?

4 个答案:

答案 0 :(得分:1)

group by两者。

select state, city, count(*) from address 
inner join person inner join purchase
where purchase.person_FK = person.id and address.person_FK = person.id
group by state, city
order by state, city;

答案 1 :(得分:1)

您可以在多个州拥有相同的城市名称,因此您必须按州分组,否则mysql无法决定在城市名称旁边显示哪个州。

答案 2 :(得分:1)

在您的情况下,您只按州和城市分组。这完全没问题,因为城市完全取决于国家。

为了回答这背后更普遍的问题,让我展示一个更高级的例子。

想象一下,你有两张桌子:

table1(维度,价值)

table2(dimension,moreinfo1,moreinfo2,...,moreinfon)

然后你不想拥有像group by dimension, moreinfo1, moreinfo2, ...这样的东西。

解决方案是将聚合放入CTE并在之后加入:

with aggr as (
  select dimension, avg(value)
  from table1
  group by dimension
)
select *
from aggr join table2 using (dimension)

如果您的SQL方言中没有using子句,只需使用您环境中常见的任何内容。

答案 3 :(得分:1)

到目前为止,每个人对Group By state, city IS的建议实际上都是正确的。

但要回答你的问题,在MySQL 5.7+ SQL模式下,“only_full_group_by”默认打开。这意味着如果你要将结果组合在一起,你选择在SELECT语句中显示的所有字段都必须是一些汇总的结果。例如。 SUM(),MAX(),MIN(),COUNT(),等等......

在你的情况下,“状态”被留作标准结果..这意味着你无法保证你将在“州”栏中得到什么结果......你可以得到马萨诸塞州或明尼苏达州如上所述

所有这一切,如果您仍然不想得到该错误,请使用以下命令禁用此SQL模式。

SET sql_mode = ''

这将在当前MySQL连接的持续时间内删除set sql模式。

<强>咨询:

这对测试有帮助..但是如果你的查询不能用only_full_group_by ON,那么你可能做的事情非常高,你可能做的事情非常高。