【问题标题】:PostgreSQL. Search for a value through a list of attributes with a specific idPostgreSQL。通过具有特定 id 的属性列表搜索值
【发布时间】:2014-05-12 16:02:55
【问题描述】:

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

我试过了:

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,但实际上选择返回零行。如果我在属性之间将AND 更改为OR,这将导致多行,这不是我想要的,因为搜索只需要返回具有 all 属性的那个对象,那个用户在搜索字段中输入。我应该如何更改代码,它只会通过具有特定 item_attribute_type_fk 的属性来查找值并返回具有所有属性的对象行?

【问题讨论】:

    标签: java sql postgresql search attributes


    【解决方案1】:

    您似乎正在使用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 作为您的属性。查询起来不那么痛苦。

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 2019-09-14
      • 2018-08-03
      • 1970-01-01
      • 2021-09-16
      相关资源
      最近更新 更多