我需要通过特定属性搜索对象。我有一个表 item_attribute:
item_attribute item_attribute_type_fk item_fk value_text
1 1 1 bbbb 2 2 1 450-240-310 3 3 1 800x250 4 4 1 2,2 5 1 2 HBO
etc
我已经尝试过这个:
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 返回零行。如果我将属性之间的 AND
更改为 OR
,这将导致多行,这并不完全是我想要的,因为搜索只需要返回具有 所有 属性,用户在搜索字段中输入的内容。我应该如何更改代码,使其仅通过具有特定 item_attribute_type_fk 的属性查找值,并返回包含具有所有这些属性的对象的行?
最佳答案
您似乎正在使用 EAV-like架构。
要查询 EAV 中的多个值,您必须多次连接同一个表。例如
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
作为属性。查询起来要轻松得多。
关于java - PostgreSQL。通过具有特定 ID 的属性列表搜索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613724/