Сгруппируйте строки по list.id и list.Name, а количество элементов проверяйте в HAVING. Для условия «меньше пяти» нужен LEFT JOIN и COUNT(e.id), чтобы включить списки без элементов: их количество равно нулю. COUNT(*) здесь ошибочно посчитает одну строку даже для пустого списка. Ровно пять элементов не подходят ни под одно строгое условие.
Как выбрать списки, в которых больше пяти или меньше пяти элементов?
Два SQL-запроса к list и elements: группировка по списку, HAVING и учет пустых списков через LEFT JOIN и COUNT(e.id).
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Есть таблицы 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.