【发布时间】:2013-09-14 02:54:31
【问题描述】:
我需要在 mysql 中实现价格的时间旅行视图。 底价表是这样的:
CREATE TABLE product_price (
product_id INT(11) NOT NULL,
date_valid TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
price DECIMAL(15,4) NOT NULL,
PRIMARY KEY(product_id,date_valid)
);
这个想法是,随着时间的推移,我会选择我预先输入的正确有效价格。 也许这个概念以后会更清楚。 我需要创建一个视图,以便为每个 product_id 获得最新价格。 过了一会儿,我找到了满足我需要的 SELECT:
SELECT * FROM (
SELECT product_id,price FROM product_pric
WHERE date_valid <= CURRENT_TIMESTAMP
ORDER BY date_valid DESC
) xx GROUP BY product_id;
为了创建所需的视图,我知道我不能使用子选择,需要创建一个或多个中间视图。像这样:
CREATE VIEW v_product_price_time AS
SELECT product_id,price FROM product_pric
WHERE date_valid <= CURRENT_TIMESTAMP
ORDER BY date_valid DESC
;
CREATE VIEW v_product_price AS
SELECT * FROM v_product_price_time GROUP BY product_id;
然后我得到的与我写的原始查询不同。 例如,我只用两行填充表格:
INSERT INTO product_price (product_id,date_valid,price ) VALUES ( 1,'2013-01-01',41.40 );
INSERT INTO product_price (product_id,date_valid,price ) VALUES ( 1,'2013-01-03',42.0 );
原始查询返回正确的数据 (1,42.0),但查询视图没有。我总是得到 (1,41.40)。
我肯定遗漏了一些东西,因为我不太了解 MySQL。 使用另一个开源 RDBMS 我已经做过类似的事情,但现在我需要处理 MySQL v5.5 并且无法更改它。 但是开发者论坛中的文档和一些搜索并没有让我找到解决方案。 关于如何解决这个问题的任何想法? TIA。
【问题讨论】:
-
您的表主键需要更改为 PRIMARY KEY(product_id,date_valid DESC)。从长远来看,您将获得更好的性能。
-
@Gilbert Le Blanc 你绝对是对的。但到目前为止,我很难理解。
标签: mysql view greatest-n-per-group