在mysql 8.0中排除重复项

在mysql 8.0中排除重复项,mysql,group-by,mysql-8.0,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

在升级到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;
错误出现了,正如之前有人建议的那样,我必须将所有select列添加到GROUP BY,以便查询变得更简单

按国家/地区、ID从订单组中选择国家/地区、ID

但这并不能消除重复项,而是显示了所有国家

预期结果是:

mysql> SELECT Country,ID,userID FROM orders GROUP BY Country;

+------+---------+------------+
| ID   | Country | UserID     |
+------+---------+------------+
|   51 | USA     | 99         |
|   61 | UK      | 12         |
+------+---------+------------+ 

注意:列名只是为了简单起见,在我的例子中,每个国家都有相同的用户名,您需要修改SELECT子句,以便它使用: 选择国家/地区,任意值ID

有关为什么会发生这种情况的更详细信息,请参阅

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


最小值、最大值或任意_值,前提是您确定B列值无论如何都是重复的,并且其中任何一个都可以工作。在MySQL的早期版本中,引擎会默默地忽略这些差异,并默认应用ANY_值逻辑。

您需要告诉我们要为每个国家显示哪个ID值,因为给定的国家很可能有多个唯一的ID值。这个难题是MySQL中错误的根源。至于你为什么会突然看到这种情况,这是因为你使用的MySQL的新版本是在不同的服务器模式下运行的。要删除重复项,你应该使用distinct而不是group byAha,谢谢你声明,现在我可以理解问题出在哪里了,对我来说这并不重要。我怎样才能告诉mysql给我最后一行匹配的数据。@我用distinct尝试了scaisEdge,但添加另一列并不能删除重复项,因为一行中的国家和ID是唯一的。重复项。。在sql中,对行进行求值。。对于一行中的每个值。。你说复制品是什么意思?更新你的问题添加一个合适的数据样本和预期结果谢谢你的回答,任何我想要的值,因为ID和其他列在我的情况下并不重要。