尝试做以下事情:
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
我查看了关于过滤一对多连接关系的其他帖子,这些关系最终使用了计数和不同来解决非常具体的利基案例(Filter a one-to-many query by requiring all of many meet criteria),但我希望有一个更清晰,更通用的解决方案。
继续努力,如果我能够击败stackoverflow,我会回发一个解决方案:)
答案 0 :(得分: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%';
非常脆弱,如果您的搜索属性具有袋鼠字样关系,则会中断。但是,这必须要做到现在。