這依舊是中等題,想了好久,終于理解了很開心!
一、題目相關內容
1)相關的表和題目
2)幫助理解題目的示例,提供返回結果的格式
二、自己初步的理解
題目是找出2019-08-16 時全部產品的價格,所以重點是獲取想要的時間的產品價格。
提供的表記錄了某產品在某個日期更改后的新價格。
那就是改了價格的就有記錄;沒改就輸出,那這里先思考沒改的話,price就等于10,但是可能是核心點沒有思考全目前也沒有具體的想法,先想簡單的點好像也不行。
1)那改價格有不同時間改的,16之前以及16這一天改的要及時輸出,這一天之后修改對于本題來說話沒有意義,重點是有可能改了不止一次。所以要取最大的日期但是不大于16號修改的記錄。
2)因為這里同一個的產品可能改了多次,那就需要根據product_id進行分組。然后獲取分組里不大于16號的最大的日期的價格。
3)然后這里需要聯系上沒有修改價格的product_id,但是我發現這個題目里沒有所有的產品的id,只有可能是在16號之后修改的產品的價格就是'10'。
然后下面這是我的解答
select p1.product_id,ifnull(p1.new_price,'10') as price from products p1 left join(select product_id,new_price from products group by product_id having max(change_date)<='2019-08-16') change_price on p1.product_id=change_price.product_id;
其實我都自信滿滿的啦,但是給我顯示錯誤,就是下圖的錯誤,所以我屈服去看題解了,不過這次有進步不斷地思考自己的邏輯,沒有和之前一樣,自己邏輯都沒有理清的時候就去看題解,搞得最后一知半解。
三、題解展示和分析
正確的題解如下。
select p1.product_id,ifnull(p2.new_price,10) as price from (select distinct product_id from products) p1 left join(select product_id,new_price from products where(product_id,change_date)in(select product_id,max(change_date) from products where change_date <= '2019-08-16' group by product_id))p2 on p1.product_id=p2.product_id;
我和大佬的區別在上面兩段紅色的代碼部分,這說明我總體的邏輯是對的,有兩個點,一獲取全部產品的id的方式不對,沒有想到提取的是不重復的id。二是我直接的子查詢和where in的區別,我是想著分組后,每個組里的修改日期最大值<=16號,但其實可以從我上面錯誤的答案明顯的看出來我是沒有過濾成功的,但是我一直想不通啊,這里做一個嘗試,因為我有兩個錯誤,那我把第一個錯誤改一下正確題解的,但是這一個錯誤先不改,就改成了下面的題解
select p1.product_id,ifnull(p2.new_price,10) as price from (select distinct product_id from products) p1 left join(select product_id,new_price from products group by product_id having max(change_date)<='2019-08-16')p2 on p1.product_id=p2.product_id;
輸出還是不對,如下
這明顯第二個錯誤是有問題的,沒有找到最大的日期,但是確實確實不知道原因!!!!!!!!!
但我知道為什么正確答案正確,啊啊啊!!!
select product_id,new_price from products where(product_id,change_date)in(select product_id,max(change_date) from products where change_date <= '2019-08-16' group by product_id
1)小部分正確答案的分析邏輯
正確答案這部分是在找id和新價格
什么樣的id和新價格呢
首先新價格的日期都要小于或者等于16(啊啊啊,這不直接就省掉了很多的記錄嗎,我一直想著分組后篩選,又沒篩對,我還不理解,難啊難!!)
然后找分組過后的里面的最大的日期,注意啊這是篩選后最后找最大的日期,不像之前是全部的日期找最大的(這邏輯不就一下子出來了嗎,那我的邏輯是什么)
?2)我的小部分答案分析邏輯
我的答案也是在找id和新價格
什么樣的id和新價格呢
分組后,新價格的日期的最大值都要小于或者等于16的記錄
?3)總結上述對比
我知道了!!!!!因為新價格的日期最大值可能大于16,但小一點的小于16。也說明了為啥我的第二條記錄為啥錯誤,他不滿足條件就輸出10。
而且從上面的輸出可以看出來,我的第一個答案也是錯了的,這是為什么呢?我自己的猜測是三條記錄都滿足條件,那就選擇第一個輸出!!
所以啊,要把邏輯盤順啊,你就非常好理解了!
四、總結
仔細想仔細想自己的邏輯,切記啊,你不了解自己那你別指望了解正確的題解,正確的答案都在那了,別放著不拿哈,當然前提是你明確自己的邏輯你才是走上了那答案的第一步,加油加油,寫完了這難纏的一題了!