LEFT JOIN с условием в WHERE потерял заказы без платежей
Задача: получить все заказы за день вместе со статусом платежа, включая заказы, по которым платежа ещё нет.
Вы написали запрос:
SELECT o.id, p.status
FROM orders o
LEFT JOIN payments p ON p.order_id = o.id
WHERE p.status = 'success';
Заказы без платежей в результат не попали.
Почему?
- Левое соединение не сохраняет строки левой таблицы при отсутствии пары справа, для такой задачи нужен FULL JOIN
- Порядок таблиц указан неверно: в левом соединении orders должна стоять справа от payments
- Условие по правой таблице в WHERE отсекает строки с NULL и превращает соединение во внутреннее
- Не хватает GROUP BY по o.id, без группировки строки без платежей схлопываются в пустоту
