Итак, я обновил свой ящик ubuntu, и mysql пришел на поездку к славному 5.7, что привело к гибели:
[:error] [pid 9211] [client 0.0.0.0:1] PHP Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1140 In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'a.Z'; this is incompatible with sql_mode=only_full_group_by
Линия, на которую он ссылается, это:
$s = $d->prepare("SELECT aZ,aY,aX,MAX(bF) as `G` FROM `a`,`b` WHERE (aP=:va1 && bR:va2)");
Отклонить запросы, для которых список выбора, условие HAVING или ORDER BY относятся к неагрегированным столбцам, которые не имеют ни имени в предложении GROUP BY, ни функционально зависят от столбцов GROUP BY (уникально определенных).
источник: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
Итак, вот мои 4 вопроса:
1- неагрегированные столбцы являются aZ
, aY
, aX
?
2- функционально зависимая от =?
3- однозначно определяется. Буквально столбцы, которые (например) P_Id int NOT NULL UNIQUE
?
4- Хотя эту ошибку я могу исправить, добавив any_value()
вокруг aZ
, aY
и aX
я до сих пор не понимаю, почему я это делаю. Я полагаю, что альтернативой было бы сделать группу с помощью aZ
или / и aY
или / и aX
. Но какой из этих 3 я выбираю в группе и почему?
Кроме того, я не хочу отключать only_full_group_by
. Я хотел бы понять, как правильно исправить эту текущую проблему и, скорее всего, астрономическое число, которое будет следовать.
Да. Неагрегированные столбцы – это любой столбец, который не использует функцию агрегации, такую как MAX
, COUNT
, SUM
, GROUP_CONCAT
и т. Д.
Столбец a
функционально зависит от столбца b
если значение b
подразумевает конкретное значение a
. Обычно это означает, что b
является уникальным ключом для таблицы, а a
является другим столбцом в этой таблице.
Определено однозначно, так же, как и функциональная зависимость.
Альтернативой было бы перечисление всех неагрегированных столбцов в списке GROUP BY aZ, aY, aX
: GROUP BY aZ, aY, aX
.
Причиной всего этого является то, что при выборе столбцов, не входящих в список GROUP BY
, они будут поступать из произвольных строк в сгруппированных строках. Это приводит ко многим распространенным ошибкам. Например, распространенная ошибка заключается в том, чтобы написать:
SELECT user_id, MAX(timestamp), ip_address FROM user_logins GROUP BY user_id
и ожидайте, что ip_address
будет содержать адрес последнего входа для каждого пользователя. Но на самом деле он будет содержать любой из адресов, в которые они вошли, а не из строки с MAX(timestamp)
. См. SQL Выберите только строки с максимальным значением в столбце для правильного способа сделать это.
Исключение функциональной зависимости обычно полезно для объединений.
SELECT u.user_id, u.user_name, MAX(l.timestamp) FROM users AS u JOIN user_logins AS l ON u.user_id = l.user_id GROUP BY u.user_id
Поскольку user_id
является основным ключом таблицы users
, он однозначно определяет имя пользователя, поэтому нет необходимости перечислять это явно в GROUP BY
.