MySQL 5.7 & only_full_group_by

Итак, я обновил свой ящик 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 . Я хотел бы понять, как правильно исправить эту текущую проблему и, скорее всего, астрономическое число, которое будет следовать.

Related of "MySQL 5.7 & only_full_group_by"

  1. Да. Неагрегированные столбцы – это любой столбец, который не использует функцию агрегации, такую ​​как MAX , COUNT , SUM , GROUP_CONCAT и т. Д.

  2. Столбец a функционально зависит от столбца b если значение b подразумевает конкретное значение a . Обычно это означает, что b является уникальным ключом для таблицы, а a является другим столбцом в этой таблице.

  3. Определено однозначно, так же, как и функциональная зависимость.

  4. Альтернативой было бы перечисление всех неагрегированных столбцов в списке 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 .