Необходимо ли использовать GROUP BY, когда мы выбираем статистическую функцию для столбца в дополнение к столбцу без статистической функции? - PullRequest
0 голосов
/ 10 июня 2019

Я получаю сообщение об ошибке:

«Столбец Weather.cityName» недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY ».

Почему здесь необходимо использовать GROUP BY?

SELECT cityName , MAX (highTemperature) As highTemperature
FROM Weather
WHERE cityName = 'Rawalpindi';

Ответы [ 2 ]

1 голос
/ 10 июня 2019

MySQL позволяет использовать такой синтаксис:

Обработка MySQL для GROUP BY

SQL: 1999 и более поздних версий разрешает такие неагрегаты для дополнительной функцииT301, если они функционально зависят от столбцов GROUP BY: Если такая связь существует между name и custid, запрос является допустимым.Например, это был бы случай, когда клиент был основным клиентом.

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

SELECT cityName , MAX(highTemperature) As highTemperature
FROM Weather
WHERE cityName IN('Rawalpindi', 'Delphi');
-- In aggregated query without GROUP BY,
-- expression #1 of SELECT list contains nonaggregated column 'cityName';
-- this is incompatible with sql_mode=only_full_group_by

SELECT cityName , MAX(highTemperature) As highTemperature
FROM Weather
WHERE cityName = 'Rawalpindi';

дБ <> fiddle demo

1 голос
/ 10 июня 2019

Почему необходимо использовать GROUP BY. У вас есть запрос агрегации, в котором вы хотите вернуть одну строку на город - даже если есть только один город. Это делает ваш запрос агрегацией. Вы можете настроить запрос так, чтобы он не был нужен. Вот два метода:

SELECT MAX(cityName) as cityName, MAX(highTemperature) As highTemperature
FROM Weather
WHERE cityName = 'Rawalpindi';

Или:

SELECT 'Rawalpindi' as cityName, MAX(highTemperature) As highTemperature
FROM Weather
WHERE cityName = 'Rawalpindi';

Оба они являются действительными запросами агрегации без GROUP BY. Таким образом, они будут возвращать ровно одну строку - даже если ни одна строка не соответствует предложению WHERE. Вместо CityName они используют либо функцию агрегации, либо константу, поэтому проблем нет.

...