[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;