🧠 Условие:
У тебя есть две таблицы:
users
---------
id | name
---|-----
1 | Alice
2 | Bob
3 | Charlie
orders
----------
id | user_id | total
----|---------|-------
1 | 1 | 100
2 | 1 | 200
3 | 2 | 300
Нужно вывести всех пользователей и количество их заказов, включая тех, у кого заказов нет вообще.
Ты пишешь:
SELECT u.id, u.name, COUNT(o.id) AS order_count
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
❌ Результат:
1 | Alice | 2
2 | Bob | 1
А где Charlie? 😡
📌 Подвох: JOIN убирает строки без соответствий — Charlie не попадает в результат вообще.
Нужно использовать LEFT JOIN, чтобы сохранить всех пользователей.
✅ Правильное решение:
SELECT u.id, u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
Теперь результат:
1 | Alice | 2
2 | Bob | 1
3 | Charlie | 0
💡 Вывод:
Хочешь сохранить всех из "левой" таблицы — используй LEFT JOIN.
А COUNT(о.id) не считает NULL — и это хорошо: ты получаешь реальное число заказов, а не просто 1 за NULL.
@sqlhub