Хотели, но не купили
Теперь список желаний начинает приносить деньги. На следующей неделе магазин хочет отправить предложение со скидкой всем, у кого в списке желаний есть игра, которую они не купили: «Игра из вашего списка желаний — со скидкой 20%!» Некоторые покупатели с тех пор купили игру, которую хотели, и предложение на неё только раздражило бы их.
Что именно значит «не купил»? Что нет оплаченного заказа этого покупателя, в котором есть эта игра. Возвращённый заказ не считается: Jack Harris купил Shadow Ninja, но вернул её, поэтому предложение он всё же может получить. А предложение имеет смысл только для игр, которые уже вышли: Robot Rebellion и Mystery Manor пока никто купить не может.
«Нет такой строки, что…» — работа для NOT EXISTS. Для каждой строки внешнего запроса база данных выполняет подзапрос, а NOT EXISTS оставляет строку, если подзапрос ничего не нашёл. Подзапрос использует столбцы внешней строки, поэтому он коррелированный. Например, покупатели, которые не написали ни одного отзыва:
SELECT c.name
FROM customers AS c
WHERE NOT EXISTS (
SELECT *
FROM reviews AS r
WHERE r.customer_id = c.id
)
ORDER BY c.name;| name |
|---|
| Henry Scott |
| Max Baker |
В вашем запросе подзапрос ищет оплаченный заказ того же покупателя (o.customer_id = w.customer_id) с той же игрой (i.game_id = w.game_id). Покупатель и статус лежат в orders, игра — в order_items, поэтому подзапрос соединяет эти две таблицы.
Типичная ошибка: пропустить одно из условий, которые связывают подзапрос с внешней строкой. Без o.customer_id = w.customer_id подзапрос спрашивает, купил ли игру хоть кто-нибудь, и Liam Turner не получит предложение на Knight's Oath только потому, что Emma Clark её купила.
Задание
- 1
Под комментарием
-- 4. Хотели, но не купилинапишите список для предложений: имя и email покупателя и название игры (столбцыname,emailиtitle) для каждого желания, игра которого уже вышла (releasedнеNULL) и которую покупатель не купил в оплаченном заказе. Отсортируйте по имени, а затем по названию. Вот все 7 предложений:name email title Ava Green ava.green@mail.com Star Pilots Emma Clark emma.clark@mail.com Goal Rush Isla Young isla.young@mail.com Dragon Forge Jack Harris jack@harris.io Shadow Ninja Liam Turner liam.t@mail.com Knight's Oath Max Baker max.baker@mail.com Goal Rush Oscar King oscar.king@mail.com Knight's Oath - 2
А для сравнения — желания, которые сбылись: желания, игру которых покупатель купил в оплаченном заказе. Покажите столбцы
nameиtitle, отсортированные так же:name title Ava Green Dragon Forge Olivia Brown Knight's Oath Sophie Adams Zombie Town