2011-05-26 62 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字段。