- 表結構如下
欄位名 | 型別 | 說明 |
---|---|---|
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,
這個條件是不定的,會有其他的屬性篩選。
- 要求
效能第一,杜絕聚合函式等
- 已經嘗試過的方法
-
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
這種可以做到條件少的情況下滿足,但一旦條件增加反而耗時極長。
- in
用in作條件會導致查詢只要滿足一個條件就被查詢出來。
比如查詢pn_id in (5,12)
那麼上述這個資料沒有12也會被搜尋出來。
- union all
條件少的情況下,速度就很慢了,何況條件多呢