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

非常に特定のニッチなケースを解決するためにカウントと個別を使用することになる1対多の結合関係のフィルタリングに関する他の投稿を見ました(多くの条件を満たすすべての条件を要求することにより、1対多のクエリをフィルタリングします)が、よりクリーンな方法があることを願っています、これに対するより一般的な解決策。

離れて作業を続けるつもりです。スタックオーバーフローを打ち負かすことができれば、解決策を投稿します:)

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 に答える