3

次のpostgres dbテーブルを持つDjangoアプリケーションがあります: パブリケーションとタグ

Publication {
    title
    tags
}

Tag {
    title
}

タグとパブリケーションには、多対多の関係があります。

私がやりたいことは、and/or コンボ検索を実行することです。たとえば、A、B、C、D の 4 つのタグがあるとします。A または B タグが関連付けられているすべての出版物を検索し、ANDそれに関連付けられた C OR D タグ。たとえば、検索フィールドに次のように入力します: (A || B) && (C || D)。つまり、結果は、各「または」ペアから少なくとも 1 つのタグを持つパブリケーションを生成する必要があります。

タグのタイトルを入力して、出版物のタイトルを返すことができるようにしたいと考えています。

私は Django フィルターを使用してこれを実行しようとしましたが、昨日もこの質問をしました: AND/OR 検索 Django-Postgres アプリを実行する効率的な方法は何ですか? そして最終的に、生の続編クエリを実行する方がおそらく優れていることに気付きました。唯一の問題は、生の続編ステートメントを書いたことがないことです。

ここ数時間、この質問を見て過ごしました: How to filter SQL results in a has-many-through relationship , そしてそれを自分の状況に適用しようとしています, しかし、私はあまりにも初心者であり、それを行うことができません.それ。

私のモデルが与えられた場合、このクエリを構築する方法を誰かに教えてもらえますか?

4

1 に答える 1

4

もちろん、n:m の関係を実装するテーブルが必要です。お気に入り

publication_tag {
    publication_id
    tag_id
}

次に、クエリは次のようになります。

SELECT p.publication_id, p.publication
FROM   publication p
WHERE  EXISTS (SELECT 1 FROM publication_tag
               WHERE  publication_id = p.publication_id
               AND    tag_id IN ('A', 'B')
              )
AND    EXISTS (SELECT 1 FROM publication_tag
               WHERE  publication_id = p.publication_id
               AND    tag_id  IN ('C', 'D')
              )

これは、可能な限り最速のソリューションの 1 つです。リレーショナル除算のサンプル クエリが多数ある、頼りになる質問は既に見つかりました。

于 2013-06-07T17:35:32.840 に答える