Задача
Вы хотите знать, уникальны ли значения таблицы.
Решение
Используйте инструкцию 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, не включая его в список столбцов вывода.