В дополнение к способности группировать данные с помощью предложения GROUP BY
, SQL также позволяет осуществлять фильтрацию — указывать, какие группы должны быть включены в результат, а какие исключены из него. Например, вам может понадобиться список клиентов, которые сделали хотя бы два заказа. Чтобы получить такие данные, необходим фильтр, относящийся к целой группе, а не к отдельным строкам.
В данном случае предложение WHERE
использовать нельзя, поскольку фильтры WHERE
указывают строки, а не группы. Собственно говоря, WHERE
"не знает", что такое группы.
Но тогда что можно использовать вместо предложения WHERE
? SQL предлагает другое предложение, подходящее для этих целей: предложение HAVING
. Предложение HAVING
очень похоже на предложение WHERE
. И действительно, все типы выражений в предложении WHERE
могут быть также использованы с предложением HAVING
. Единственная разница состоит в том, что WHERE
фильтрует строки, a HAVING
— группы.
Нужно найти страницы с одинаковыми адресами, как выглядит часть таблицы (таблица test):
id | name | url |
---|---|---|
1 | Главная | / |
2 | Раздел | /razdel |
3 | Новость | /news |
4 | Еще один раздел | /razdel |
Теперь напишем запрос который выведит нужные записи:
select `url` from `test` group by `url` having count(*)>=2
Данный запрос группирует все записи по полю url
и выводит те значения поля url
которые встречаются 2 или более раз.
Результат будет:
url |
---|
/razdel |
Как видите, предложение WHERE
здесь не работает, поскольку фильтрация основана на итоговом значении группы, а не на значениях указанных строк.
Вот как это можно рассматривать: WHERE
фильтрует до того, как данные будут сгруппированы, a HAVING
фильтрует после того, как данные были сгруппированы. Это— важное различие; строки, которые были выброшены по предложению WHERE
, не будут включены в группу, иначе это могло бы изменить вычисляемые значения, которые, в свою очередь, могли бы повлиять на фильтрацию групп в предложении HAVING
.
Статья написана на основе главы "Фильтрующие группы" из книги Освой самостоятельно SQL.
Рубрики:
SQL
В статье приводится пример регистрации собственного события в bitrix и добавления на него обработчика.
grep - удобная и быстрая команда, здесь приведены примеры как произвести рекурсивный поиск в каталоге, поиск среди запущенных процессов и другие.
В статье приводится пример кода для создания простого горизонтального слайдера с использованием CSS и небольшим количеством JS кода. Для реализации потребуется всего около 60 строк стилей и js кода.
В статье приводится пример кода подключения bitrix без подключения шаблона сайта. Так же описано когда это может пригодится.
В статье приводится пример того как можно получить путь до зарегистрированного файла по его ID с помощью метода CFile::getPath($fileId). Так же показано где можно получить ID зарегистрированного файла.
В статье приводится пример того как можно подключить только компонент битрикс без подключения его шаблона, чтобы можно было вызвать его метод или получить значения свойств