2011-05-26 77 views
0

我有以下SQL-選擇(SQLite的/ MySQL的):減少內部連接

SELECT products.* FROM products 
INNER JOIN specifications AS spec1 ON specifications.product_id = product.id 
INNER JOIN specifications AS spec2 ON specifications.product_id = product.id 

WHERE products.language = "de" 
AND products.category = "ABC" 


AND (spec1.name = 'Innenabmessungen' AND spec1.value = '182x53') 
AND (spec2.name = 'Farbe'   AND spec2.value = 'schwarz') 

有隻使用一個INNER JOIN的解決方案?問題是我想用兩個以上的spec-filter來製作SELECT。這可能嗎?

+4

只要你有合適的索引,連接並沒有那麼糟! – 2011-05-26 09:10:17

+1

恭喜您重新發現[EAV](http://en.wikipedia.org/wiki/Entity-attribute-value_model)帶來的痛苦,當您實際需要查詢屬性時。 – 2011-05-26 09:30:37

回答

1

如果你想從規格表中均有記載那麼就不能簡化返回值,因爲兩個查找在你的榜樣的規格表所需

但是如下,你可以把它改寫:

SELECT products.* FROM products 

WHERE products.language = "de" 
AND products.category = "ABC" 
AND (SELECT COUNT(*) FROM specifications WHERE 
(specifications.name = 'Innenabmessungen' AND specifications.value = '182x53' AND specifications.product_id = product.id) OR 
(specifications.name = 'Farbe' AND specifications.value = 'schwarz' AND specifications.product_id = product.id) 
) = 2 

雖然我不認爲會有性能上的收益,除非你第一次做的規格表中查找,以找到匹配的product_id行,然後看着的名稱/值

Obviou狡猾的你需要索引規格表中的product_id,name和value字段,以及產品表中的productid,language和category字段。