LEFT JOIN, после которого пропали клиенты без заказов
Нужен список всех клиентов с их оплаченными заказами, включая тех, у кого оплаченных заказов нет. Написали так:
SELECT c.id, c.name, o.id AS order_id
FROM clients c
LEFT JOIN orders o ON o.client_id = c.id
WHERE o.status = 'paid';
В результате клиенты без оплаченных заказов в выдачу не попали. Почему?
- LEFT JOIN не сохраняет строки, если в правой таблице в колонке status оказывается NULL; чтобы вернуть клиентов без заказов, соединение меняют на RIGHT JOIN
- Не хватает GROUP BY c.id: без группировки строки клиентов без заказов схлопываются с дубликатами и не попадают в выдачу
- Для клиентов без оплаченных заказов o.status равен NULL, и условие в WHERE их отбрасывает — LEFT JOIN фактически превращается в INNER; условие по правой таблице нужно перенести в ON
- Неверно выбран порядок таблиц во FROM: при LEFT JOIN таблица, по которой идёт фильтрация в WHERE, должна стоять первой, иначе строки теряются
