У меня есть следующая структура данных для продуктов на заказной платформе электронной коммерции (все еще в разработке, поэтому будьте доброжелательны: P).
Это текущее определение для таблицы цен на продукты (я решил смоделировать ее по отдельности, чтобы своевременно составлять отчеты о динамике цен для каждого конкретного продукта)
CREATE TABLE IF NOT EXISTS commerce_products_price (
price_id INT(11) NOT NULL AUTO_INCREMENT,
product_id INT(11) NOT NULL,
price FLOAT NOT NULL,
price_offer FLOAT,
date_added DATETIME NOT NULL
PRIMARY KEY (price_id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Я хотел бы получить список продуктов (по идентификатору), которые имеют падение в цене. Прямо сейчас, SQL-запрос, который я смоделировал, выглядит так:
SELECT
DISTINCT(p1.product_id) AS product_id
FROM commerce_products_price p1
INNER JOIN commerce_products_price p2 ON (p1.product_id = p2.product_id) AND (p2.date_added > p1.date_added)
WHERE p2.price < p1.price
Причиной этого является получение последних двух записей истории цен для сравнения друг с другом. Если вторая цена ниже, чем первая, то товар имеет падение цены.
Вот SQL Fiddle Я создал для вас. Я нацелился на MySQL 5.5 (это ядро базы данных, которое есть в моей виртуальной машине).
Но это не работает так, как я хочу, и я уверен, что что-то упустил. Я выбрал этот вопрос в качестве основы для построения моего запроса. Еще одна вещь, которую я хотел бы добавить к этому запросу, это возможность получить список товаров с падением цены с заданным порогом (аля DATEDIFF(...) <= 15
) но я думаю, это вопрос добавления чего-то вроде DATEDIFF(p1.date_added, NOW()) BETWEEN ? AND ?
,
Любая подсказка будет с благодарностью 🙂
Попробуй это:
SELECT
p1.product_id
FROM commerce_products_price p1
LEFT JOIN commerce_products_price p2 ON (p1.product_id = p2.product_id)
LEFT JOIN (
Select p3.product_id, max(date_added) as maxD,min(date_added) as minD
from commerce_products_price p3
group by p3.product_id
) p4 ON (p1.product_id = p4.product_id)
WHERE p2.price < p1.price
AND p2.date_added = p4.maxD AND p1.date_added = p4.minD
Других решений пока нет …