Как выбрать списки, в которых больше пяти или меньше пяти элементов?

Два SQL-запроса к list и elements: группировка по списку, HAVING и учет пустых списков через LEFT JOIN и COUNT(e.id).

Короткий ответ

Что ответить на собеседовании

Сгруппируйте строки по list.id и list.Name, а количество элементов проверяйте в HAVING. Для условия «меньше пяти» нужен LEFT JOIN и COUNT(e.id), чтобы включить списки без элементов: их количество равно нулю. COUNT(*) здесь ошибочно посчитает одну строку даже для пустого списка. Ровно пять элементов не подходят ни под одно строгое условие.

Подробный разбор

Ответ с пояснениями

Условие

Есть таблицы list(id, Name) и elements(id, Name, list_id). Нужно отдельно вывести названия списков, содержащих больше пяти и меньше пяти элементов. Предположим, что id в обеих таблицах — непустой уникальный идентификатор, а elements.list_id указывает на список.

Больше пяти элементов

SELECT l.Name
FROM list AS l
JOIN elements AS e ON e.list_id = l.id
GROUP BY l.id, l.Name
HAVING COUNT(e.id) > 5;

INNER JOIN здесь достаточен: список без элементов все равно не пройдет условие. Группировка по идентификатору не дает смешать разные списки с одинаковыми названиями.

Меньше пяти элементов

SELECT l.Name
FROM list AS l
LEFT JOIN elements AS e ON e.list_id = l.id
GROUP BY l.id, l.Name
HAVING COUNT(e.id) < 5;

Меньше пяти — это также ноль. LEFT JOIN сохраняет список без совпадающих элементов, заполняя поля e значениями NULL. COUNT(e.id) игнорирует NULL и дает ноль. В отличие от него COUNT(*) считает строку соединения и дал бы единицу для пустого списка.

Проверка на небольших количествах:

Число элементов Больше 5 Меньше 5
0 Нет Да
4 Нет Да
5 Нет Нет
6 Да Нет

HAVING применяется к сформированным группам. Обычный WHERE не заменяет условие по количеству. Если нужно считать только активные элементы, условие для второго запроса обычно добавляют в ON: фильтр правой таблицы в WHERE может исключить пустые списки.

Синтаксис регистра и кавычек для идентификатора Name зависит от того, как создана таблица в выбранной СУБД. В примере используются обычные неквотированные имена. Порядок результата не задан; если он важен, добавьте ORDER BY.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку