[SQL]1164 又是被主键坑了的一天

1164. 指定日期的产品价格

之前一直不知道主键是干啥的,读题就总选择性忽略了主键,然后今天这个题,给我上了生动的一课...

思路很简单,关键是要选出每个产品2019-08-16之前最大日期,以及它对应的产品id及价格。大概就是创造一个这个样子的临时表。

然后我写出了这样子的代码。

SELECT product_id, MAX(change_date) AS date
FROM Products 
WHERE change_date <= '2019-08-16'
GROUP BY product_id

然后发现,我的临时表为什么总是这个样子。

也就是说,他的价格和日期没有对应上!!

看了别人的答案,我才发现主键的重要性。

直到我的代码变成:

SELECT product_id, new_price
FROM Products
WHERE (product_id, change_date) IN (SELECT product_id, MAX(change_date) AS date
                                    FROM Products 
                                    WHERE change_date <= '2019-08-16'
                                    GROUP BY product_id)

他才乖乖听话给我对应上了。

其实上上篇博客没有解决的问题,也是出在这里了。

行了我知道主键不是写着好看的了。

SELECT t1.product_id, IFNULL(new_price, 10) AS price
FROM (SELECT DISTINCT product_id FROM Products) t1 LEFT JOIN
(SELECT product_id, new_price
FROM Products
WHERE (product_id, change_date) IN (SELECT product_id, MAX(change_date) AS date
                                    FROM Products 
                                    WHERE change_date <= '2019-08-16'
                                    GROUP BY product_id) ) t2
ON t1.product_id = t2.product_id;
posted @ 2020-04-16 15:38  whiky  阅读(120)  评论(0编辑  收藏  举报