java - PostgreSQL。通过具有特定 ID 的属性列表搜索值

标签 java sql postgresql search attributes

我需要通过特定属性搜索对象。我有一个表 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

考虑转换为使用 jsonhstore 作为属性。查询起来要轻松得多。

关于java - PostgreSQL。通过具有特定 ID 的属性列表搜索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613724/

相关文章:

java - 在 apache 反向后面使用 java/GWT 的站点无法正常工作

java - JFrame 屏幕闪烁白光和黑光

mysql - SQL 少于 7 天

SQL Server,将秒转换为分钟、小时、天

postgresql - 数据库备份无法使用数据库管理器

java - 如何将 ArrayList<Vector3f> 转换为 ByteBuffer?

java - 如何部署 ADF 业务组件?

mysql - 两个 where "date"子句有不同的列

sql - postgres 的 "fetch_status"替代方案

typescript - TypeError : this. postgres.Pool 不是构造函数