【发布时间】:2016-04-27 03:10:34
【问题描述】:
如果只有一个商店的价格信息,下面的 SQL 将返回每个产品的最近最低价格,如果有多个商店的价格信息,则并不总是返回最近的最低价格!?
想要的结果
从所有商店的最新价格信息中返回产品的最低价格,因此如果有 6 家商店,它将显示 6 家商店中每家商店最近价格记录中的最低价格。
如果所有商店价格记录的最新价格相同且更新日期也相同,则可以按商店订购记录以选择相关产品的价格。
{product id} 是传入的值,具体取决于所显示的产品。
SQL
SELECT `vsp`.`prod_id`
, `vsp`.`price`
, `vsp`.`store`
, `vsp`.`updated`
FROM `price` `vsp`
WHERE NOT EXISTS
(
SELECT *
FROM `price` `vsp2`
WHERE `vsp2`.`prod_id` = `vsp`.`prod_id`
AND `vsp`.`prod_id` = {product id}
AND (`vsp2`.`updated` > `vsp`.`updated` OR (`vsp2`.`updated` = `vsp`.`updated` AND `vsp2`.`price` < `vsp`.`price`))
) AND `vsp`.`prod_id` = {product id}
价格
prod_id | price | store | updated
--------------------------------------------------------
product 1 | 1.99 | 1 | 2016-01-20 00:00:00
product 2 | 1.49 | 1 | 2016-01-20 00:10:00
product 2 | 1.19 | 2 | 2016-01-20 00:00:00
product 3 | 12.49 | 1 | 2016-01-20 00:00:00
product 3 | 12.49 | 2 | 2016-01-20 00:00:00
product 4 | 9.89 | 1 | 2016-01-20 00:00:00
product 5 | 10.00 | 1 | 2016-01-20 00:10:00
product 5 | 9.99 | 2 | 2016-01-20 00:00:00
product 5 | 10.49 | 3 | 2016-01-20 00:00:00
预期输出
product 1 | 1.99 | 1 | 2016-01-20 00:00:00
product 2 | 1.49 | 1 | 2016-01-20 00:10:00
product 3 | 12.49 | 1 | 2016-01-20 00:00:00
product 4 | 9.89 | 1 | 2016-01-20 00:00:00
product 5 | 9.99 | 2 | 2016-01-20 00:00:00
电流输出
product 1 | 1.99 | 1 | 2016-01-20 00:00:00
product 2 | 1.49 | 1 | 2016-01-20 00:10:00
product 3 | 12.49 | 1 | 2016-01-20 00:00:00
product 4 | 9.89 | 1 | 2016-01-20 00:00:00
product 5 | 10.00 | 1 | 2016-01-20 00:10:00
更新 #1
当我将 prodId 约束添加到查询中时,选择本身看起来工作得很好,并且只返回一个价格,现在的问题是,如果我将 select 语句添加到函数中,它会给出以下错误,即使我只看到我自己运行选择时返回的一个值。
Result consisted of more than one row
SQL 函数
CREATE FUNCTION FN_GET_SET_LOWEST_PRICE (`prodId` VARCHAR(20))
RETURNS DOUBLE
BEGIN
DECLARE `latestPrice` DOUBLE(7,2) DEFAULT 0;
SELECT p3.price
INTO `latestPrice`
FROM price p3
INNER JOIN
(
SELECT p1.prod_id, MIN(p1.price) AS minPrice
FROM price p1
INNER JOIN
(
SELECT prod_id, MIN(updated) AS minUpdated
FROM price
GROUP BY prod_id
) p2
ON p1.prod_id = p2.prod_id AND p1.updated = p2.minUpdated
GROUP BY p1.prod_id
) t
ON p3.prod_id = t.prod_id AND p3.price = t.minPrice
WHERE p3.prod_id = prodId;
RETURN `latestPrice`;
END//
DELIMITER ;
【问题讨论】:
-
如果您用简单的英语告诉我们,在
product有多个记录的情况下,决定保留哪条product记录的逻辑是什么,我认为这可能会对我们有所帮助在price表中。 -
@TimBiegeleisen,感谢您的反馈,我已将
wanted outcomesn-p 添加到问题中以尝试弄清楚我正在尝试做的事情。 -
您如何决定为
product 3保留存储 1 而不是存储 2?如何处理这种平局情况? -
@TimBiegeleisen,我从来没有发现过,但是是的,这是另一个没有考虑到的情况,我想说我可以在那种情况下按商店订购,但不确定这会如何影响整体我正在努力达到的结果。
-
在我花了 45 分钟回答您的问题时,请随时为我投票。