LEFT JOIN, из которого пропали пользователи без заказов
Нужен список всех пользователей с числом заказов за 2026 год, включая тех, у кого заказов не было. Написали так:
SELECT u.user_id, COUNT(o.order_id) AS orders
FROM users u
LEFT JOIN orders o ON o.user_id = u.user_id
WHERE o.created_at >= '2026-01-01'
GROUP BY u.user_id;
В результате пользователи без заказов отсутствуют. Почему и как исправить?
- COUNT(o.order_id) пропускает пустые группы — нужно заменить его на COUNT(*)
- Для пользователей без заказов нужен отдельный запрос и UNION: LEFT JOIN не сохраняет строки без пары, если в запросе есть GROUP BY и агрегатная функция, поэтому пустые группы приходится добирать вручную
- Не хватает o.created_at в GROUP BY, из-за чего строки с NULL схлопываются и теряются
- Условие на правую таблицу в WHERE отбрасывает строки, где o.created_at равен NULL, и LEFT JOIN превращается в INNER JOIN — условие по дате нужно перенести в ON
