0

试图做一些事情:

Table Entities

id |  timestamp
---------------
1  | 2012-06-05 12:00:00

Table Attributes

entity_id | attribute
---------------------
1         |   a
1         |   b

我希望能够做的事情:

select entity.id, entity.timestamp from entities entity join attributes on entity.id = attribute.id where entity.has.attributes a and b

结果集现在看起来很糟糕,但假设它在实体表上有其他列是有意义的。所以结果集将是:

id | timestamp
--------------
1  | 2012-06-05 12:00:00

我查看了有关过滤一对多连接关系的其他帖子,这些连接最终使用计数和不同来解决非常具体的利基案例(通过要求所有满足条件过滤一对多查询),但我希望有一个更清洁的,更通用的解决方案。

继续工作,如果我能击败stackoverflow,我会发回一个解决方案:)

4

1 回答 1

1

这就是我迄今为止的工作。正如所指出的,它并不漂亮,我敢说性能不高,但我将研究全文搜索索引,看看它们能提供什么。

select e.id, e.timestamp from entities e join 
    (select entity_id, string_agg(attribute, ',' order by attribute) as attr from attributes 
     group by entity_id) a 
on e.id = a.entity_id where a.attr like '%a%b%';

但这假设您在聚合中有 order by 子句。如果您选择忽略它,这应该有效:

select e.id, e.timestamp from entities e join 
    (select entity_id, string_agg(attribute, ',') as attr from attributes 
     group by entity_id) a 
on e.id = a.entity_id where a.attr like '%a%' and a.attr like '%b%';

非常脆弱,如果您的搜索属性具有类似袋鼠词的关系,则会中断。但是,现在必须这样做。

于 2013-06-02T22:46:49.270 回答