11. Посчитать пользователей по статусам и найти пропавших пользователей
Условие задачи:
Даны две таблицы:
User— пользователи;Status— статусы пользователей.
Всего в таблице User находится 10 пользователей.
После подсчёта получился результат:
Новый | 5
Работает | 3
Необходимо написать запрос, который покажет количество пользователей в каждом статусе, и объяснить, почему в результате отображаются только 8 из 10 пользователей.
Код:
User
id
name
status_id
Status
id
name
Спойлеры к решению
Подсказки
INNER JOIN возвращает только строки, для которых найдено соответствие в обеих таблицах.💡 Проверь пользователей, у которых
status_id IS NULL.💡 Чтобы не потерять таких пользователей, используй
LEFT JOIN.💡 Отсутствующий статус можно вывести отдельной группой через
COALESCE.Решение
Если написать запрос через обычный JOIN:
SELECT
s.name AS status_name,
COUNT(u.id) AS user_count
FROM users u
JOIN status s
ON s.id = u.status_id
GROUP BY s.id, s.name;
пользователи без статуса в результат не попадут.
Например, если у двух пользователей:
status_id = NULL
то INNER JOIN исключит их, и сумма количества пользователей будет равна 8.
Чтобы сохранить всех пользователей, нужно использовать LEFT JOIN:
SELECT
COALESCE(s.name, 'Без статуса') AS status_name,
COUNT(u.id) AS user_count
FROM users u
LEFT JOIN status s
ON s.id = u.status_id
GROUP BY
s.id,
s.name;
Результат может выглядеть так:
status_name | user_count
------------|-----------
Новый | 5
Работает | 3
Без статуса | 2
Таким образом, два пользователя не исчезли из таблицы — они были исключены из результата из-за INNER JOIN, поскольку для них не нашлось соответствующего статуса.