我想显示按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“
不兼容你们能帮助我吗?
答案 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,那么你可能做的事情非常高,你可能做的事情非常高。