Механизм работы COUNT() в MySQL

264
26 ноября 2016, 20:21

Почему для того, чтобы посчитать количество повторяющихся значений в поле, можно написать:

SELECT *, COUNT(phone) 
FROM registered_phones
GROUP BY phone HAVING COUNT(1)>1; 

А для того, чтобы посчитать количество неповторяющихся значений, нужно писать:

SELECT COUNT(*) 
FROM (
SELECT DISTINCT phone FROM registered_phones
) t;

и нельзя написать:

SELECT DISTINCT phone, COUNT(phone) FROM registered_phones;

Этот последний запрос возвратит неверное значение. Чем это обусловлено?

UPD:

Также я заметила, что всё-таки вернуть верное количество неповторяющихся значений можно следующим запросом:

SELECT DISTINCT phone, COUNT(DISTINCT phone) FROM registered_phones;
Answer 1

SELECT COUNT(*) FROM ( SELECT DISTINCT phone FROM registered_phones ) t;

Выбрать phone, отбросить повторяющиеся и подсчитать количество оставшихся

SELECT DISTINCT phone, count(phone) FROM registered_phones;

Для всех записей вывести значения поля phone и количество записей в таблице, где phone IS NOT NULL. Из пар (phone, count) отбросить дубликаты

Answer 2
  1. Потому что группируем по строке и смотрим, сколько раз она встречается

    SELECT *, COUNT(phone) 
    FROM registered_phones
    GROUP BY phone
    HAVING COUNT(1) > 1
    
  2. Что мешает для поиска неповторяющихся значений написать так?

    SELECT *, COUNT(phone) 
    FROM registered_phones
    GROUP BY phone
    HAVING COUNT(1) = 1
    
  3. Потому что данный запрос сначала сделает подсчёт количества - составит таблицу из phone и count(phone), а потом пройдётся снова и выполнит DISTINCT, то есть удаление всех дубликатов (который будет бесполезен, т.к. мы используем агрегирующие функции и группировку):

    SELECT DISTINCT phone, COUNT(phone)
    FROM registered_phones
    GROUP BY phone;
    

    В этом случае надо использовать удаление дубликатов при подсчёте количества, то есть использовать COUNT(DISTINCT phone)

READ ALSO
Не сохраняются картинки на компьюторе

Не сохраняются картинки на компьюторе

Подскажите пожалуйстаЭто файл обработки картинок

240
SQL Select больше или равно

SQL Select больше или равно

Здравствуйте! Помогите пожалуйста разобраться Есть таблица со колонкой price (тип int) в ней записи 50, 75, 100

345
Подключение к MySQL вопрос на тему порта

Подключение к MySQL вопрос на тему порта

Добрый день! Возникла необходимость отловить неправильно введённые url\port\login\password для подключения к БД и выводить соответствующие сообщения...

258
Что значит режим MySQL “NO_AUTO_VALUE_ON_ZERO”?

Что значит режим MySQL “NO_AUTO_VALUE_ON_ZERO”?

Что значит режим MySQL NO_AUTO_VALUE_ON_ZERO?

247