[英]Improve SQL query with multiple IN sub-query (filter by attribute system)
我有一個帶有屬性系統的產品目錄。
我想創建一個系統,使客戶可以按屬性瀏覽產品(例如在Magento上)。 因此,我試圖以編程方式檢索具有屬性(具有特定值)(或具有許多特定值的許多屬性)的產品列表(通過ID返回)。
它運作良好,但是我的SQL查詢太可怕了!
例如:如果我要檢索具有這3個屬性(和值)的產品列表,這是我當前的SQL查詢:
第三個過濾器: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.