mysql - MySQL GROUP BY 子查询中的功能依赖
问题描述
我正在编写一个查询来查找人员表中的重复行(包括每个重复行):
SELECT *
FROM Person
WHERE CONCAT(firstName,lastName) IN (
SELECT CONCAT(firstName,lastName) AS name
FROM Person
GROUP BY CONCAT(firstName,lastName)
HAVING COUNT(*) > 1
)
在启用了 ONLY_FULL_GROUP_BY 的 MySQL 8.0.19 中运行它时,它会失败并出现以下错误:
查询 1 错误:HAVING 子句的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“Person.firstName”;这与 sql_mode=only_full_group_by 不兼容
我不知道如何解决这个问题。我试图改变COUNT(*)
,COUNT(CONCAT(firstName,lastName))
但没有帮助。
奇怪的是 a) 它在 MariaDB 10.2 中运行良好,有或没有 ONLY_FULL_GROUP_BY,并且 b) 单独运行子查询不会导致任何问题。
我究竟做错了什么?它几乎看起来像是 MySQL 中的一个错误。
[编辑]:我当然很欣赏我的查询的替代解决方案,但是我真的很想回答为什么我的错误会发生。
解决方案
像下面这样尝试它会和你尝试的一样
SELECT *
FROM Person
WHERE (firstName,lastName) IN (
SELECT firstName,lastName
FROM Person
GROUP BY firstName,lastName
HAVING COUNT(*) > 1
)
推荐阅读
- jquery - MustacheJS 有条件地显示 DOM
- appkit - 在 Big Sur 中隐藏默认的 NSOutlineView 展开/折叠箭头
- google-app-engine - 如何在 Google App Engine 中过滤和查看每日日志?
- python - 将字典转换为字符串
- android - 如何使线性布局在协调器布局内可滚动?
- java - 如何重用 maven 的 .repository 内容以避免重新下载每个项目构建的外部依赖项?
- python - 如何使用 get 请求的响应通过 aiohttp 上传文件?
- android - Android Studio HAXM 未安装
- azure - 区域出现故障时单个 Azure VM 会发生什么
- node.js - node.js 的 lambda 函数将如何用于使用存储到 DynamoDB 的 for application/x-www form-urlencoded 数据的发布请求