我正在尝试获取具有某些属性的部件。每个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我会在连接上使用别名。
答案 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。等等。
也许您不应该在关系数据库中执行此类查询,而应该在数据仓库或支持分面的索引搜索引擎中执行此类查询。