SQL задача: найти записи, в которых значение столбца встречается по крайней мере N раз

В данном посте рассмотрим варианты решения SQL задачи: найти записи, в которых значение столбца встречается по крайней мере N раз.

Для решения задачи будем использовать GROUP BY и HAVING в трех различных вариантах: EXISTS, JOIN, IN. Для примера будем использовать простую таблицу Names:

CREATE TABLE Names(
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`)
);

Будем искать записи в таблицы Names где одинаковые значения столбца name встречаются более 3 раз.

Решение с помощью EXISTS. По моим замерам выполняющееся с наибольшей скоростью.

SELECT a.*
FROM Names a
WHERE EXISTS (SELECT NULL
              FROM Names c
              WHERE c.name = a.name
              GROUP BY c.name
              HAVING COUNT(*) > 3); 

Решение с помощью JOIN. По моим замерам выполняющееся с меньшей скоростью, чем решение с EXISTS.

SELECT a.*
FROM Names a
JOIN (SELECT c.name
      FROM Names c
      GROUP BY c.name
      HAVING COUNT(*) > 3) b ON b.name = a.name;

Решение с помощью IN. По моим замерам выполняющееся с наименьшей скоростью.

SELECT a.*
FROM Names a 
WHERE a.name IN 
     (SELECT b.name FROM Names b 
      GROUP BY b.name HAVING COUNT(*) > 3);

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий