【发布时间】: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 中的重复 .. 被评估为行 .. (对于一行中的每个值).. 显示重复的意思是什么?更新您的问题添加适当的数据样本和预期结果