Список SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец users.id ', который функционально не зависит от столбцов в GROUP BY - PullRequest
0 голосов
/ 27 апреля 2018

У меня возникли проблемы с группировкой по и в том же запросе

SELECT *
FROM users
WHERE id IN
    (SELECT id
     FROM users
     GROUP BY firstname
     HAVING count(*) > 1)

Получение этой ошибки

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 Выражение №1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'roag.org.users.id', который функционально не зависит от столбцов в GROUP BY. оговорка; это несовместимо с sql_mode = only_full_group_by

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

ANY_VALUE() ваш друг:

SELECT *
FROM users
WHERE id IN
   (SELECT ANY_VALUE(id)
    FROM users
    GROUP BY firstname
    HAVING count(*) > 1)
0 голосов
/ 27 апреля 2018

Это, вероятно, потому что вы неправильно использовали пресловутое расширение MySQL GROUP BY в более старой версии MySQL. Они отключили его по умолчанию в текущей версии, с 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. Агрегирование не так волшебно, как хотелось бы всем.

0 голосов
/ 27 апреля 2018

Попробуйте это

    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. Если вы группируете по идентификатору, я уверен, что вы не получите желаемый результат, поэтому сгруппируйте по имени (и выберите также имя)

0 голосов
/ 27 апреля 2018

Вы не можете использовать *, так как вы уже используете group by. Если вы используете таблицу, как показано ниже:

a | b | c | d

Вы можете группировать по:

select a, sum(b), max(c), min(d) group by a;

Подумайте об этом, если вы group, но не уверены, какое поле вы агрегируете, и как вы можете заставить MySQL узнать вас, что вы хотите, чтобы он понял? так что здесь просто убедитесь, что вы действительно хотите сделать, перед агрегированием по group.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...