Выбор групп только с определенными характеристиками

Задача
Вы хотите вычислить итоги для групп, но результаты вывести только для групп, отвечающих определенным требованиям.

Решение
Используйте инструкцию HAVING.

Обсуждение
Вы уже умеете применять инструкцию WHERE для задания условий, которым должны удовлетворять отдельные записи, выбираемые запросом. Кажется естественным использовать WHERE и для написания условий для итоговых значений. Но ничего не выйдет. Если вы захотите узнать, какой водитель из таблицы driver_log работал больше трех дней, то, вероятно, начнете с такого запроса:

mysql> SELECT COUNT(*), name
-> FROM driver_log
-> WHERE COUNT(*) > 3
-> GROUP BY name;
ERROR 1111 at line 1: Invalid use of group function

Дело в том, что WHERE указывает на исходные ограничения, определяющие, какие строки следует выбирать, но значение функции COUNT() может быть получено лишь после того, как строки выбраны. Необходимо поместить выражение COUNT() в инструкцию HAVING, аналогичную WHERE, но применяемую к групповым характеристикам, а не отдельным записям. То есть HAVING работает с уже выбранным и сгруппированным набором строк, применяя к нему дополнительные условия, сформированные на основе результатов агрегирующей функции, которые не были известны в момент первичной выборки.

Предыдущий запрос можно переписать так:

mysql> SELECT COUNT(*), name
-> FROM driver_log
-> GROUP BY name
-> HAVING COUNT(*) > 3;

+------------+---------+
| COUNT(*) | name |
+------------+---------+
| 5 | Henry |
+-------------+--------+

Если вы используете инструкцию HAVING, то можете включить в запрос и инструкцию WHERE, но только для выбора строк, не для проверки итоговых значений.Инструкция HAVING может ссылаться на псевдонимы:

mysql> SELECT COUNT(*) AS count, name
-> FROM driver_log
-> GROUP BY name
-> HAVING count > 3;

+-------+-------+
| count | name |
+-------+-------+
| 5 | Henry |
+-------+-------+.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Группирование по результатам выражения
Использование ключевого слова DISTINCT для удаления дубликатов
Итоги и значения NULL
Итоги по датам
Классификация некатегориальных данных

Вернуться в раздел: MySQL / 7. Формирование итогов