Java PostgreSQL。通过具有特定id的属性列表搜索值

Java PostgreSQL。通过具有特定id的属性列表搜索值,java,sql,postgresql,search,attributes,Java,Sql,Postgresql,Search,Attributes,我需要通过特定属性搜索对象。我有一个表项_属性: 项目\属性项目\属性\类型\ fk项目\ fk值\文本 等 我试过这个: SELECT item,name,sale_price,producer,producer_code,store_price,I.type_name FROM ((item INNER JOIN unit_type ON unit_type_fk=unit_type) INNER JOIN item_store ON item=item_fk)AS I INNER J

我需要通过特定属性搜索对象。我有一个表项_属性:

项目\属性项目\属性\类型\ fk项目\ fk值\文本 等

我试过这个:

SELECT item,name,sale_price,producer,producer_code,store_price,I.type_name 
FROM ((item INNER JOIN unit_type ON unit_type_fk=unit_type) 
INNER JOIN item_store ON item=item_fk)AS I 
INNER JOIN item_attribute AS A ON I.item=A.item_fk 
WHERE store_price BETWEEN 200.0 AND 300.0 
AND (UPPER(value_text) LIKE UPPER('%b%') AND item_attribute_type_fk=1) 
AND (UPPER(value_text) LIKE UPPER('%2%') AND item_attribute_type_fk=4) 
GROUP BY item,I.type_name ORDER BY item
结果应该是行,其中item_fk=1,但实际上select返回零行。如果我将属性之间的
更改为
,将产生多行,这并不是我想要的,因为搜索只需要返回用户在搜索字段中键入的具有所有属性的对象。我应该如何更改代码,使其仅通过具有特定项_attribute _type _fk的属性查找值,并返回具有所有这些属性的带有对象的行?

您似乎正在使用架构

要在EAV中查询多个值,必须多次加入同一个表。e、 g

SELECT item,name,sale_price,producer,producer_code,store_price,I.type_name 
FROM 
  item 
  INNER JOIN unit_type ON unit_type_fk=unit_type
  INNER JOIN item_store ON item=item_fk)AS I 
  INNER JOIN item_attribute AS a1 ON I.item = a1.item_fk 
  INNER JOIN item_attribute AS a2 ON I.item = a2.item_fk   -- note second join
WHERE store_price BETWEEN 200.0 AND 300.0 
  AND (UPPER(a1.value_text) LIKE UPPER('%b%') AND a1.item_attribute_type_fk=1) 
  AND (UPPER(a2.value_text) LIKE UPPER('%2%') AND a2.item_attribute_type_fk=4) 
GROUP BY item, I.type_name
ORDER BY item
考虑将属性转换为使用
json
hstore
。质疑的痛苦要小得多

SELECT item,name,sale_price,producer,producer_code,store_price,I.type_name 
FROM 
  item 
  INNER JOIN unit_type ON unit_type_fk=unit_type
  INNER JOIN item_store ON item=item_fk)AS I 
  INNER JOIN item_attribute AS a1 ON I.item = a1.item_fk 
  INNER JOIN item_attribute AS a2 ON I.item = a2.item_fk   -- note second join
WHERE store_price BETWEEN 200.0 AND 300.0 
  AND (UPPER(a1.value_text) LIKE UPPER('%b%') AND a1.item_attribute_type_fk=1) 
  AND (UPPER(a2.value_text) LIKE UPPER('%2%') AND a2.item_attribute_type_fk=4) 
GROUP BY item, I.type_name
ORDER BY item