這個 SQL 問題絕對能讓你對 MySQL 的理解更進一步!目前公司還沒人想出解決方案

simpleT發表於2019-05-31
  • 表結構如下
欄位名 型別 說明
id int id
pn_id int 屬性型別
pv_id int 屬性值
product_id int 產品ID

其中product_id與pn_id,pv_id是一對多的關係。
資料類似這樣:

product_id pn_id pv_id
10970 5 (型號) 135 (蘋果9)
10970 11 (記憶體) 23 (512G)
10970 10 (顏色) 17 (土豪金)
10970 8 (網路) 6(5G)
10980 5 135
10980 11 24 (1024G)
10980 10 16 (極光藍)
  • 問題

找出型號為蘋果9同時記憶體為512G,顏色為土豪金產品ID
這個條件是不定的,會有其他的屬性篩選。

  • 要求

效能第一,杜絕聚合函式等

  • 已經嘗試過的方法
  1. join自身,有幾個pn_id,pv_id條件就join幾次

    select product_id from product as a join prodcut as b
    on a.product_id = b.product_id 
    where a.pn_id =5 and a.pv_id = 135
    and b.pn_id = 11 and b.pv_id = 23

    這種可以做到條件少的情況下滿足,但一旦條件增加反而耗時極長。

  2. in
    用in作條件會導致查詢只要滿足一個條件就被查詢出來。
    比如查詢pn_id in (5,12)
    那麼上述這個資料沒有12也會被搜尋出來。
  1. union all
    條件少的情況下,速度就很慢了,何況條件多呢

三海

相關文章