我在一个定制的电商平台上有以下产品数据结构(仍在开发中,所以要仁慈: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;
我想获取降价的产品列表(按 ID)。现在,我模拟的 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(这是我的虚拟机中的数据库引擎)。
但它并没有像我想要的那样工作,我确信我错过了一些东西。我选择this问题作为构建查询的基础。我想在这个查询中添加的另一件事是能够获取具有给定阈值的价格下降的产品列表(ala
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