Основная проблема
Поэтому я создаю сервис, где клиенты регистрируются и получают загадочные игрушки.Клиенты дают нам партии заказов (каждый заказ со своим ценовым лимитом), а затем мы пытаемся соединить каждый отдельный заказ с тем, что, по нашему мнению, является лучшей игрушкой, которая также находится под ценовым лимитом этого заказа.
Клиенты могут обновить свои предпочтения, чтобы сузить потенциальные игрушки, которые мы им отправляем;Не каждый покупатель будет заинтересован в каждой имеющейся у нас игрушке.И, конечно, они не хотят, чтобы мы отправляли им одну и ту же игрушку дважды.
Вопрос
Если у меня есть две таблицы: PotentialToys (в которых перечисленыкакие игрушки могут пойти к каким покупателям, вместе с их ценой и ранжированием по оценочной стоимости) и ToyOrders (с указанием покупателя, ценовым лимитом для каждого заказа и игрушкой, которую мы планируем дать им (по умолчанию ноль, для установки в UPDATE))), как я могу ОБНОВИТЬ заказы в таблице ToyOrders, чтобы выбрать игрушки, которые находятся под ценовым лимитом этого заказа и выбираются только один раз для покупателя?
Пример схемы MySQL
CREATE TABLE PotentialToys (
customer NVARCHAR(25) NOT NULL,
toy NVARCHAR(25) NOT NULL,
price DECIMAL(5,2) NOT NULL,
rank INTEGER NOT NULL
);
CREATE TABLE ToyOrders (
order_id INTEGER PRIMARY KEY AUTO_INCREMENT,
customer NVARCHAR(25) NOT NULL,
price_limit DECIMAL(5,2) NOT NULL,
rank INTEGER NOT NULL,
selected_toy NVARCHAR(25)
);
INSERT INTO PotentialToys (customer, toy, price, rank) VALUES
('Alice', 'Chemistry Kit', 20.00, 1),
('Alice', 'Stuffed Bear', 5.00, 2),
('Alice', 'Playing Cards', 10.00, 3),
('Bob', 'Playstation', 500.00, 1),
('Bob', 'Baseball Monkey', 25.00, 2),
('Bob', 'Stuffed Bear', 5.00, 3),
('Bob', 'Chemistry Kit', 20.00, 4),
('Carlos', 'Magic Trick Set', 50.00, 1),
('Carlos', 'Playing Cards', 10.00, 2),
('Carlos', 'Banana-Phone', 20.00, 3);
INSERT INTO ToyOrders (customer, price_limit, rank) VALUES
('Alice', 20.00, 1),
('Alice', 15.00, 2),
('Alice', 10.00, 3),
('Bob', 25.00, 1),
('Bob', 25.00, 2),
('Bob', 15.00, 3),
('Carlos', 25.00, 1);
Желаемый вывод после обновления ToyOrders
SELECT order_id, customer, price_limit, selected_toy FROM ToyOrders;
+-------------------------------------------------------------
| order_id | customer | price_limit | selected_toy |
+-------------------------------------------------------------
| 1 | Alice | $20.00 | Chemistry Kit |
| 2 | Alice | $15.00 | Stuffed Bear |
| 3 | Alice | $10.00 | Playing Cards |
| 4 | Bob | $25.00 | Baseball Monkey |
| 5 | Bob | $25.00 | Stuffed Bear |
| 6 | Bob | $15.00 | NULL | -- No toys left for Bob under $15. It's OK to leave NULL
| 7 | Carlos | $25.00 | Playing Cards | -- The magic trick set cost more than the order's price limit, so he gets the next best thing
Что я пробовал до сих пор:
SET @offset_rank = 0;
UPDATE ToyOrders AS O
INNER JOIN PotentialToys AS PT
ON O.customer = PT.customer
AND O.rank + @offset_rank = PT.rank
AND IF(PT.price <= O.price_limit, TRUE, (@offset_rank := @offset_rank + 1) && FALSE)
SET O.selected_toy = PT.toy;
выше только производит правильный вывод для Алисы;В итоге Боб и Карлос получают неправильные посылки, например:
+-------------------------------------------------------------
| order_id | customer | price_limit | selected_toy |
+-------------------------------------------------------------
| 1 | Alice | $20.00 | Chemistry Kit |
| 2 | Alice | $15.00 | Stuffed Bear |
| 3 | Alice | $10.00 | Playing Cards |
| 4 | Bob | $25.00 | NULL | -- Should be Baseball Monkey, not NULL
| 5 | Bob | $25.00 | Stuffed Bear |
| 6 | Bob | $15.00 | NULL |
| 7 | Carlos | $25.00 | Banana-Phone | -- Should be Playing Cards
Что мне делать по-другому?