У меня есть список продуктов и список категорий.
Каждый товар относится к некоторым категориям в определенное время,
i.e время от времени мы меняем товары в категориях.
Получить список продуктов данной категории на основе последнего моментального снимка?
Таким образом, чтобы сохранить журнал, у меня есть таблица Product_Category
с 3-мя полями:
category_id [INT], product_id [INT], snapshot_date [DATE]
Где snapshot_date
это последнее время обновления категории со всеми продуктами
Я хочу, чтобы выбрать все продукты ids, для данной категории_ид (предположим, category_id = 1
), где я хочу только товары для последнего моментального снимка этой категории
Например, предположим данные в Product_Category:
+-------------+------------+---------------+
| category_id | product_id | snapshot_date |
+-------------+------------+---------------+
| 1 | 1 | 2015-01-01 | -----> old snapshot ignore it
| 1 | 2 | 2015-01-01 | -----> old snapshot ignore it
| 1 | 3 | 2015-01-01 | -----> old snapshot ignore it
| 1 | 1 | 2015-01-07 | -----> last snapshot for category 1, this is my target
| 1 | 5 | 2015-01-07 | -----> last snapshot for category 1, this is my target
| 1 | 7 | 2015-01-07 | -----> last snapshot for category 1, this is my target
| 2 | 5 | 2015-01-01 | -----> another category, old snapshot, ignore it
| 2 | 7 | 2015-01-07 | -----> another category, last snapshot, ignore it
| 2 | 3 | 2015-01-07 | -----> another category, last snapshot, ignore it
+-------------+------------+---------------+
Учитывая category_id = 1
, я хочу, чтобы результат
+------------+
| product_id |
+------------+
| 1 |
| 5 |
| 7 |
+------------+
Вот что я сделал до сих пор:
SELECT product_id
FROM Product_Category
WHERE category_id = 1
AND snapshot_date = (
SELECT MAX(snapshot_date)
FROM Product_Category
WHERE category_id = 1
);
Есть ли лучшее решение тха делать вложенными выбирает?
PS, я использую MySQL, если ответ может быть различным на основе РСУБД
Yup, один продукт может существовать в нескольких категориях, например, продукт «treadmill» находится в категории «фитнес-устройства» и категории «электронные устройства», он предназначен для упрощенных открытых данных –
. , Я понял. Ваш запрос в порядке. –
Не входит ли вложенный выбор очень плохой в производительности? O (n^2)? Вот почему я ищу альтернативу –