Нужна помощь в написании небольшого запроса на sql
Есть табличка курток с полями name и price. При покупке 2 курток сумма которых больше 5000, третья куртка в подарок. Нужно написать запрос, который возвращает имя и цену 3 курток. При этом самым выгодным способом, то есть первые 2 куртки должны быть самыми дешевыми, но чтобы их сумма была от 5000, а третья куртка наоборот, самая дорогая. Первые 2 куртки не должны повторяться.
Я решил для начала найти первые 2 куртки и справился с этой задачкой, сравнивая стоимость каждой пары курток , вот запрос:
select *
from jacket j1 join jacket j2
where j1.price + j2.price =
(select min(j1.price + j2.price)
from jacket j1 join jacket j2
where j1.price + j2.price >= 5000
and j1.name != j2.name)
limit 1
Можно ли прикрутить сюда часть запроса, которая возвращает самую дорогую куртку? Или придется полностью менять логику запроса? И можно ли вообще сделать это одним запросом?
Ответы (1 шт):
Вариант реализации:
-- исходные данные
CREATE TABLE test (
id INT AUTO_INCREMENT PRIMARY KEY,
price INT
);
INSERT INTO test (price) VALUES (1000), (1900), (2200), (2700), (3200), (4200);
SELECT *,
t1.price + t2.price payment,
t1.price + t2.price + t3.price total_price
FROM test t1
JOIN test t2 ON t2.id > t1.id -- исключить дубликаты-"перевёртыши"
AND t1.price + t2.price >= 5000 -- сумма двух не менее 5000
JOIN test t3 ON t3.id NOT IN (t1.id, t2.id)
ORDER BY payment ASC, -- минимальная оплата
total_price DESC -- максимальная общая сумма
LIMIT 1
| id | price | id | price | id | price | payment | total_price |
|---|---|---|---|---|---|---|---|
| 2 | 1900 | 5 | 3200 | 6 | 4200 | 5100 | 9300 |