在MySQL中,使用GROUP BY
是将数据集按照一个或多个列分组,计算每个组的总和、平均值、最大值、最小值等的基本方法。在使用GROUP BY
的时候,有时会出现1055错误:Expression #L of SELECT list is not in GROUP BY clause and contains nonaggregated column X which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
。这个错误的原因是MySQL只允许在SELECT中出现在GROUP BY子句中的列,或者是使用聚合函数的列。这篇攻略将介绍如何解决这个问题并给出两个示例。
以前的方法
在以前,解决这个问题的方法是将sql_mode设置为非ONLY_FULL_GROUP_BY
的模式,例如:
SET sql_mode = ''
这种方法的缺点是它可能会隐藏真正存在的问题,也可能导致错误的结果。因此,这不是一个推荐的方法。
怎么解决
相比之前的方法,推荐的方法是:
- 将需要在SELECT中呈现的非聚合列添加到GROUP BY子句中。
- 将需要在SELECT中呈现的非聚合列使用聚合函数进行转换。
下面分别介绍这两种方法。
方法1:添加非聚合列到GROUP BY子句中
这是比较常用的方法,直接将需要在SELECT中呈现的非聚合列添加到GROUP BY子句中。
例如,我们有这样一张表user:
user_id | name | age |
---|---|---|
1 | Tom | 20 |
2 | Peter | 25 |
3 | Mary | 22 |
4 | John | 28 |
如果我们想要按照name字段对数据进行分组:
SELECT name, age FROM user GROUP BY name;
这样会出现1055的错误。因为虽然我们把name列添加到了GROUP BY子句中,但是我们还需要把age列添加上去才可以。正确的SQL语句是:
SELECT name, age FROM user GROUP BY name, age;
方法2:使用聚合函数转换非聚合列
如果你不想使用GROUP BY来分组,而只是想要在SELECT语句中使用非聚合列,则可以使用聚合函数进行转换。
例如,我们仍然有这样一张表user:
user_id | name | age |
---|---|---|
1 | Tom | 20 |
2 | Peter | 25 |
3 | Mary | 22 |
4 | John | 28 |
如果我们想要输出所有用户的姓名以及他们的年龄的加总:
SELECT name, SUM(age) FROM user;
这样同样会出现1055的错误。因为age列没有被聚合函数包装。我们可以使用SUM函数将age列进行聚合,正确的SQL语句是:
SELECT name, SUM(age) FROM user GROUP BY name;
这样,我们就不会再遇到1055的错误了。
结论
为了解决MySQL中使用GROUP BY是总是出现1055的错误,我们可以使用添加非聚合列到GROUP BY子句中或者使用聚合函数转换非聚合列两种方法。尽管添加非聚合列到GROUP BY子句中更为常见,但是无论哪种方式都可以解决问题。因此,在实际使用中,可以根据需要进行选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL中使用group by 是总是出现1055的错误(推荐) - Python技术站