SELECT列表不在GROUP BY子句中,并且包含非聚合列users.id',它在功能上不依赖于GROUP BY

时间:2018-04-27 10:22:23

标签: mysql database mysqli

我遇到了分组问题并且在同一查询查询中有问题

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

不兼容

4 个答案:

答案 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)