【问题标题】:Exclude duplicates in mysql 8.0 [duplicate]排除mysql 8.0中的重复项[重复]
【发布时间】:2019-08-01 19:18:22
【问题描述】:

在升级到 MySQL 8.0 之前,我曾经使用 GROUP BY 不选择重复项,但现在我得到了:

1055 - SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“database.orders.ID”;这与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         |
+------+---------+------------+ 

注意:列名只是为了简单起见,在我的例子中,每个“国家”都有相同的“用户 ID”

【问题讨论】:

  • 您需要告诉我们您要为每个国家/地区显示哪个 ID 值,因为一个特定国家/地区很可能有多个唯一的ID 值。这个难题是 MySQL 中错误的根源。至于为什么你会突然看到这个,是因为你使用的新版本的 MySQL 运行在不同的服务器模式下。
  • 要删除重复项,您应该使用 distinct 而不是 group by
  • 啊哈,感谢您宣布这一点,现在我可以理解问题所在了,对我来说这并不重要。如何告诉 mysql 给我最后匹配的行。
  • @scaisEdge 我尝试使用 distinct,但添加另一列不会删除重复项,因为国家和 ID 连续是唯一的。
  • sql 中的重复 .. 被评估为行 .. (对于一行中的每个值).. 显示重复的意思是什么?更新您的问题添加适当的数据样本和预期结果

标签: mysql group-by mysql-8.0


【解决方案1】:

您需要修改 SELECT 子句,使其使用: SELECT Country,ANY_VALUE(ID)

MySQL guide 上提供了有关为什么会发生这种情况的更详细信息。

为了简化原因,您仅按 A 列分组,但您还希望选择 B 列值。在分组过程中,MySQL 将折叠所有重复的行,直到保留唯一的 A 列值。但是,对于单个 A 列值,可能有多个不同的 B 列值。 MySQL 不知道它们的优先级,为了将这些多个值合并为单个标量值,您需要告诉它您要从多个 B 列值中选择哪个值。

MIN() 一个、MAX() 一个或 ANY_VALUE() 如果您确定 B 列值无论如何都是重复的并且其中任何一个都可以工作。在 MySQL 的早期版本中,引擎会默认忽略此类差异并默认应用 ANY_VALUE() 逻辑。

【讨论】:

  • 感谢您的回答,ANY_VALUE 是我要查找的内容,因为 ID 和其他列在我的情况下并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2016-03-23
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多