Нужна помощь в написании небольшого запроса на 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 шт):

Автор решения: Akina

Вариант реализации:

-- исходные данные
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

fiddle

→ Ссылка