我遇到了分组问题并且在同一查询查询中有问题
SELECT *
FROM users
WHERE id IN
(SELECT id
FROM users
GROUP BY firstname
HAVING count(*) > 1)
获取此错误
SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列'roag.org.users.id',它在功能上不依赖于GROUP BY中的列条款;这与sql_mode = only_full_group_by
不兼容答案 0 :(得分:1)
试试这个
SELECT *
FROM users
WHERE firstname IN
(SELECT firstname
FROM users
GROUP BY firstname
HAVING count(*) > 1)
您收到错误的原因是因为子查询
SELECT id
FROM users
GROUP BY firstname
HAVING count(*) > 1
您正在选择ID但它未包含在group by子句中。如果按ID分组我确定你不会得到所需的结果,所以按名字分组(并选择名字)
答案 1 :(得分:0)
由于您已使用*
,因此无法使用group by
。如果您的表格如下:
a | b | c | d
你应该按照以下方式分组:
select a, sum(b), max(c), min(d) group by a;
考虑一下,如果你group
但不确定你汇总了哪个字段,怎么能让MySQL
知道你想要它理解什么?所以这里只是确保你真正想要做什么,然后通过group
聚合。
答案 2 :(得分:0)
这可能是因为你在旧版本的MySQL中滥用了臭名昭着的MySQL GROUP BY扩展。他们默认在当前版本中使用sql_mode=only_full_group_by
禁用了它。读这个。 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
您的子查询是问题所在。看起来您正在尝试查找具有重复firstname
字段的所有行。你应该这样做。
SELECT *
FROM users
WHERE firstname IN
(SELECT firstname
FROM users
GROUP BY firstname
HAVING count(*) > 1)
为什么呢?因为SELECT id FROM users GROUP BY firstname
返回id
,而在功能上并不依赖于GROUP BY子句中的列。聚合并不像我们希望的那样神奇。
答案 3 :(得分:0)
ANY_VALUE()
是你的朋友:
SELECT *
FROM users
WHERE id IN
(SELECT ANY_VALUE(id)
FROM users
GROUP BY firstname
HAVING count(*) > 1)