在升级到MySQL 8.0之前,我曾经使用GROUP BY
来选择重复项,但现在我得到了:
1055-SELECT列表的表达式#2不在GROUP BY子句中,并且包含未聚合的列'database.orders.ID',该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by不兼容,时间:0.028000s
我知道我可以如下更改mysql模式:
mysql -u root -p
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
但是我想保留当前模式,但是解决问题。
此MySQL查询有效:
SELECT Country FROM orders GROUP BY Country
+---------+
| Country |
+---------+
| USA |
| UK |
+---------+
但是当我添加另一个MySQL列(例如ID)时:
mysql> SELECT Country,ID FROM orders GROUP BY Country;
出现错误,正如有人建议的那样,在我必须将所有选择列添加到GROUP BY
之前,查询就变成了
SELECT Country,ID FROM orders GROUP BY Country, ID
但这不会删除重复项,而是显示所有国家/地区。
预期结果是:
mysql> SELECT Country,ID,userID FROM orders GROUP BY Country;
+------+---------+------------+
| ID | Country | UserID |
+------+---------+------------+
| 51 | USA | 99 |
| 61 | UK | 12 |
+------+---------+------------+
注意:列名只是为了简单起见,在我的情况下,每个“国家/地区”都具有相同的“ UserID”
答案 0 :(得分:1)
您需要修改SELECT子句,以便使用:
SELECT Country,ANY_VALUE(ID)
MySQL guide上提供了有关发生这种情况的更详细的信息。
为简化原因,您仅按列A进行分组,但您也想选择列B的值。在分组过程中,MySQL将折叠所有重复的行,直到保留唯一的Column A值为止。但是,对于单个列A值,可能会有多个不同的列B值。 MySQL不知道它们的优先级,因此要将这些多个值折叠为单个标量值,您需要告诉它要从多个Column B值中选择哪个值。
如果您确定B列值无论如何都是重复的,并且它们中的任何一个都可以使用,则MIN()
,MAX()
或ANY_VALUE()
之一。在MySQL的早期版本中,引擎会默默地忽略这种差异,并默认应用ANY_VALUE()
逻辑。