Запрос объяснения с GROUP_BY и ONLY_FULL_GROUP_BY - PullRequest
0 голосов
/ 09 июля 2020

Я хочу понять, как работают запросы с включенным ONLY_FULL_GROUP_BY.

Если я перечисляю все столбцы таблицы с помощью MIN () в одном столбце, он отлично работает:

$query = "SELECT id, member_id, name, code, MIN(price) AS price, FROM tbl_product GROUP BY code";

Но если я выберу все, у меня будет ошибка:

$query = "SELECT *, MIN(price) AS price FROM tbl_product GROUP BY code";

Можете ли вы объяснить мне различия между ними?

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Вопрос в том, почему вы думаете, что group by будет работать с select *.

Что делает group by, так это создает одну строку для каждой комбинации значений для ключей group by. Это по определению. Несколько строк становятся одной.

Допустимые выражения в select:

  • Группа по клавишам или выражениям, содержащим только эти ключи.
  • Суммарные функции на других значениях.
  • Комбинации сводных функций с группировкой по клавишам.

Любой столбец в select, которого нет в group by, может иметь несколько значения среди исходной строки. SQL не позволяет этого. Большинство баз данных не позволяют этого. MySQL больше не позволяет это по умолчанию.

Когда-то это было так, но возвращаемые значения были из неопределенных совпадающих строк. Эта «функциональность» (на самом деле ошибка) теперь исправлена.

Примечание: есть исключение из этого - разрешенное стандартом - которое позволяет агрегировать по первичным ключам / уникальным ключам, а затем выбирать остальные колонн. Это допустимо, потому что первичный ключ однозначно определяет остальные значения столбца.

0 голосов
/ 09 июля 2020

Речь идет об ошибке, исправленной в MySQL 5.7.5. Согласно руководству 12.20.3 MySQL Обработка GROUP BY MySQL 5.7.5 и новее может обнаруживать функциональную зависимость между первичным ключом и остальными столбцами таблицы. Дословно:

MySQL 5.7.5 и выше реализует обнаружение функциональной зависимости. Если режим ONLY_FULL_GROUP_BY SQL включен (что по умолчанию), MySQL отклоняет запросы, для которых список выбора, условие HAVING или список ORDER BY относятся к неагрегированным столбцам, которые не указаны в предложении GROUP BY и не являются функционально зависит от них.

ONLY_FULL_GROUP_BY теперь является параметром по умолчанию и работает в соответствии со стандартом SQL Standard.

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