it-swarm.com.ru

Код ошибки: 1055 несовместим с sql_mode = only_full_group_by

У меня были проблемы с переключением на автономную версию базы данных Lahman SQL Baseball. Я использовал терминал, встроенный в курс EDX. Эта команда отлично работает на веб-терминале:

SELECT concat(m.nameFirst,concat(" ",m.nameLast)) as Player,
    p.IPOuts/3 as IP,
    p.W,p.L,p.H,p.BB,p.ER,p.SV,p.SO as K,
    p.IPOuts+p.W*5+p.SV+p.SO-p.BB-p.L-p.H as PTS,
    p.yearID as Year
FROM Pitching p
Inner Join Master m
    ON p.playerID=m.playerID
WHERE p.yearID=2014 AND p.IPOuts>=50
GROUP BY m.playerID
ORDER BY PTS DESC;

Который работает под управлением SQL 5.5.46, но когда я использую автономную версию под управлением 5.7.10, я получаю следующий код ошибки:

Код ошибки: 1055. Выражение # 1 из списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец stats.m.nameFirst, который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by

Я читал много решений проблем людей, но они не помогли в этом случае. Этого никогда раньше не было, поэтому я думаю, что это или супер очевидно, или, может быть, я хорошо разбираюсь в кодировании. В любом случае, кто-нибудь знает, как это исправить?

16
Frydaddy07

В 5.7 sqlmode по умолчанию установлен на:

 ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

Чтобы удалить предложение ONLY_FULL_GROUP_BY, вы можете сделать это:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Предполагается, что вам нужно сделать этот GROUP BY с неагрегированными столбцами.

С уважением

43
White Feather

Принятое выше решение не работает для меня в версии 5.7.9, for osx10.9 (x86_64).

Тогда сработало следующее -

set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
25
Anis

Для других случаев использования: вам необязательно отключать _ONLY_FULL_GROUP_BY_. В случае, подобном этому, согласно документам mysql: "Этот запрос недействителен, если name не является первичным ключом t или уникальным столбцом NOT NULL. В этом случае никакая функциональная зависимость не может быть выведена и возникает ошибка: "

_SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by
_

Вместо этого вы можете использовать это ANY_VALUE('my_column_name') my_column_name Цитируя документы mysql: "В этом случае MySQL игнорирует недетерминированность значений адресов в каждой группе имен и принимает запрос". Используйте ANY_VALUE () для ссылки на адрес:

_SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
_
6
phil