簡體   English   中英

使用多個IN子查詢改進SQL查詢(按屬性系統過濾)

[英]Improve SQL query with multiple IN sub-query (filter by attribute system)

我有一個帶有屬性系統的產品目錄。

我想創建一個系統,使客戶可以按屬性瀏覽產品(例如在Magento上)。 因此,我試圖以編程方式檢索具有屬性(具有特定值)(或具有許多特定值的許多屬性)的產品列表(通過ID返回)。

它運作良好,但是我的SQL查詢太可怕了!

例如:如果我要檢索具有這3個屬性(和值)的產品列表,這是我當前的SQL查詢:

  • 第一個過濾器:id_attribut = 3 AND value ='Lorem ipsum'
  • 第二個過濾器:id_attribut = 4 AND value ='Test2'
  • 第三個過濾器:id_attribut = 2 AND value ='Bar2'

      SELECT products.id\n 從產品\n 加入products_attributs ON products_attributs.id_product = products.id\n WHERE products_attributs.value ='Lorem ipsum'\n AND products_attributs.id_attribut = 3\n AND products_attributs.id_product ==>返回ID:25、27\n IN(\n     選擇id_product\n     FROM products_attributs\n     在哪里id_attribut = 4\n     AND值='Test2'==>返回ID:27\n     AND id_product IN(\n         選擇id_product\n         FROM products_attributs\n         在哪里id_attribut = 2\n         AND值='Bar2'==>返回ID:27\n     \n  

結果:返回ID 27(這是與客戶選擇的三個屬性相對應的唯一產品)。

它運作良好,但不是很優雅,也不是很優化(想想如果我有10個以上的濾鏡!)。

products_attributs表:

-------------------------------------------------
| id | id_product | id_attribut | value         |
-------------------------------------------------
| 1  | 25         | 1           | Foo           |
| 2  | 25         | 2           | Bar           |
| 3  | 25         | 3           | Lorem ipsum   |
| 4  | 25         | 4           | Test          |
| 5  | 27         | 1           | Foo2          |
| 6  | 27         | 2           | Bar2          |
| 7  | 27         | 3           | Lorem ipsum   |
| 8  | 27         | 4           | Test2         |
| 9  | 28         | 1           | ... etc       |
-------------------------------------------------

我該如何改善呢?

非常感謝!

使用“ nice” SQL的唯一方法是為所有屬性創建列。 這很難維護,所以我不建議這樣做。

給定的比,您可以多次連接回屬性表,如下所示:

SELECT p.id
FROM products p
LEFT OUTER JOIN products_attributs pa1 ON pa1.id_product = p.id and pa1.value = 'Lorem ipsum' AND pa1.id_attribut = 3
LEFT OUTER JOIN products_attributs pa2 ON pa2.id_product = p.id and pa2.value = 'Test2' AND pa1.id_attribut = 4
LEFT OUTER JOIN products_attributs pa3 ON pa3.id_product = p.id and pa3.value = 'Bar2' AND pa1.id_attribut = 2

祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM