MySQL / 7. Формирование итогов

Устанавливаем уникальность значения

Задача
Вы хотите знать, уникальны ли значения таблицы.

Решение
Используйте инструкцию HAVING в сочетании с функцией COUNT().

Обсуждение
Вы можете использовать инструкцию HAVING для нахождения уникальных значений в тех случаях, где ключевое слово DISTINCT неприменимо. DISTINCT удаляет дубликаты, но не сообщает о том, какие значения повторялись в исходном множестве. HAVING же может указать, какие значения уникальны, а какие – нет.

Следующий запрос выводит дни, в которые работал только один водитель, и дни, в которые работало несколько водителей. HAVING и COUNT() используются для определения того, являются ли значения trav_date уникальными:

mysql> SELECT trav_date, COUNT(trav_date)
-> FROM driver_log
-> GROUP BY trav_date
-> HAVING COUNT(trav_date) = 1;

+--------------+-----------------------+
| trav_date   | COUNT(trav_date) |
+--------------+-----------------------+
| 2001-11-26 | 1                             |
| 2001-11-27 | 1                             |
| 2001-12-01 | 1                             |
+--------------+-----------------------+

mysql> SELECT trav_date, COUNT(trav_date)
-> FROM driver_log
-> GROUP BY trav_date
-> HAVING COUNT(trav_date) > 1;

+--------------+-----------------------+
| trav_date   | COUNT(trav_date) |
+--------------+-----------------------+
| 2001-11-29 | 3                             |
| 2001-11-30 | 2                             |
| 2001-12-02 | 2                             |
+--------------+-----------------------+

Такой прием можно применять и к комбинациям значений. Например, чтобы найти количество пар отправитель-получатель (srcuser-dstuser), которые обменялись всего одним письмом, будем искать комбинации, встречающиеся в таблице mail только один раз:

mysql> SELECT srcuser, dstuser
-> FROM mail
-> GROUP BY srcuser, dstuser
-> HAVING COUNT(*) = 1;

+---------+---------+
| srcuser | dstuser |
+---------+---------+
| barb     | barb      |
| gene    | tricia      |
| phil       | barb      |
| tricia     | gene     |
| tricia     | phil        |
+---------+---------+

Обратите внимание, что запрос не выводит счетчик, как это делали предыдущие запросы с целью показать правильность подсчета. Вы можете использовать счетчик в инструкции HAVING, не включая его в список столбцов вывода.

Статьи по MySQL на эту тему:

Группирование по результатам выражения
Итоги по датам
Классификация некатегориальных данных
Нахождение наибольшего и наименьшего из итоговых значений
Одновременная работа с итогами по группам и общим итогом

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