← Все вопросы

Как найти пользователей, у которых вообще нет заказов (LEFT JOIN + IS NULL)?

Задан 17 месяцев назад969 просмотров3 ответа
19

Есть users и orders(user_id). Нужны те, кто зарегистрировался, но ни разу ничего не заказал. Слышал, что это делают через LEFT JOIN, но не понимаю при чём тут IS NULL.

3 ответа

31
✓ Принятый ответ — помог автору

Идея такая: LEFT JOIN берёт ВСЕ строки из левой таблицы (users), а если пары в orders нет — подставляет туда NULL. Значит «нет заказов» = в присоединённых колонках NULL:

SELECT u.id, u.name
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;

Проверяй на NULL именно ту колонку, которая в orders никогда не бывает пустой (обычно id или сам user_id). Условие o.id IS NULL отсекает всех, у кого пара нашлась, и оставляет «одиночек».

Vitaliy Ivanov важно: не ставь это условие в ON, иначе логика сломается — только в WHERE · 17 месяцев назад
13

Альтернатива без джойна — через подзапрос:

SELECT id, name FROM users
WHERE id NOT IN (SELECT user_id FROM orders);

Но осторожно: если в orders.user_id затешется NULL, NOT IN вернёт пусто. LEFT JOIN ... IS NULL в этом плане надёжнее.

2

LEFT JOIN.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект