Написать запрос.Всего 10 пользователей. В выводе 5 пользователей в статусе Новый, 3 пользователя в статусе Работает. Куда делось еще 2 пользователя?

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, поскольку для них не нашлось соответствующего статуса.