同一表列上的多个WHERE条件

时间:2015-09-16 10:29:05

标签: doctrine-orm doctrine dql doctrine-query

我正在尝试获取具有某些属性的部件。每个part都有许多属性,每个attribute都有一个attributeheader。所以我需要使用三个表。

SELECT * FROM Part p 
LEFT JOIN p.attributes pa
JOIN pa.attributeheader pah
WHERE (sph.name = 'size' AND sp.value IN ('11')) 
AND (sph.name = 'colour' AND sp.value IN ('Black'))

由于我在JOIN上某处出错或者没有分组,因此没有返回任何内容。我试图选择具有这两个属性的部分,因此使用OR不是解决方案。我无法解决这个问题 - 使用原始MySQL我会在连接上使用别名。

1 个答案:

答案 0 :(得分:1)

WHERE (sph.name = 'size' AND sp.value IN ('11'))
AND (sph.name = 'colour' AND sp.value IN ('Black'))

相当于

WHERE sph.name = 'size' AND sp.value IN ('11') 
AND sph.name = 'colour' AND sp.value IN ('Black')

当然sph.name不能等于' size'和'颜色'同时,你不会从这个SELECT中获得任何一行。

您需要两次加入属性表。

或多或少这样:

SELECT * FROM (Part p 
LEFT JOIN p.attributes pa
JOIN pa.attributeheader pah)
LEFT JOIN p.attributes pa2
JOIN pa.attributeheader pah2

您需要在WHERE子句中使用pa作为前缀。或者pa2。等等。

也许您不应该在关系数据库中执行此类查询,而应该在数据仓库或支持分面的索引搜索引擎中执行此类查询。