← Все вопросы
Как найти пользователей, у которых вообще нет заказов (LEFT JOIN + IS NULL)?
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.
Ваш ответ
Войдите, чтобы ответить на вопрос.