在mysql 8.0中排除重复项

时间:2019-03-11 13:04:55

标签: mysql group-by mysql-8.0

在升级到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”

1 个答案:

答案 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()逻辑。