Mam taki stan początkowy bazy danych:
CREATE TABLE users (
id INT,
money decimal,
priority int
);
INSERT INTO users (id, priority, money) VALUES (1, 7, 100);
INSERT INTO users (id, priority, money) VALUES (2, 2, 50);
INSERT INTO users (id, priority, money) VALUES (3, 3, 150);
INSERT INTO users (id, priority, money) VALUES (4, 1, 30);
INSERT INTO users (id, priority, money) VALUES (5, 8, 200);
INSERT INTO users (id, priority, money) VALUES (6, 8, 500);
INSERT INTO users (id, priority, money) VALUES (7, 4, 1200);
Powiedzmy, że potrzebuję uzyskać grupę użytkowników, których suma money wynosi >= 1400. Co więcej, chciałbym, by była to jak najmniejsza grupa, a w przypadku, gdy jest wiele tak samo liczebnych grup, to wybrać tą, w której suma priorytetów użytkowników jest największa.
Jak ktoś nie zrozumiał, to może tak: przychodzi opłacić rachunek. Trzeba wyciągnąć z bazy grupę ludzi, która jest w stanie go opłacić. Im mniej liczebna grupa tym lepiej. W przypadku, gdy jest kilka tak samo liczebnych grup, to zwracamy uwagę na priorytet.
Ma ktoś jakieś propozycje jak to zrobić? Ja wymyśliłem coś takiego:
select
(u1.priority + u2.priority + u3.priority) as total_priority,
*
from users u1
cross join users u2
cross join users u3
where
u1.id < u2.id
and u2.id < u3.id
and (u1.money + u2.money + u3.money) >= 1200
order by (u1.priority + u2.priority + u3.priority) desc
Ale to jest zapytanie dla konkretnie 3 użytkowników. Dla 2, czy 4 musiałbym dodać mniej/więcej joinów. Wolałbym takie ogólne zapytanie, dla dowolnej liczby użytkowników.