2017-01-25 12 views
2

コンテキスト:私はTAGSとCATEGORIES(すべての数多くの関係)に関するテーブルPOSTを持っています。それぞれの配列にタグやカテゴリがなくても投稿を返信したい。PostgreSQL - 2つのmany2many関係を持つSELECT

- POST1 with TAG1, TAG2 and CAT1 
- POST2 WITH CAT3, CAT4, CAT5 
- POST3 

私は返すようにしたい:

- POST1/{TAG1, TAG2}/{CAT1} 
- POST2/NULL/{CAT3, CAT4, CAT5} 
- POST3/NULL/NULL 

しかし、私は持っている:

- POST1/{TAG1, TAG2}/{CAT1, NULL, NULL} 
- POST2/{NULL, NULL}/{CAT3, CAT4, CAT5} 
- POST3/{NULL, NULL}/{NULL, NULL, NULL} 

スクリーンショットが動作しない場合は、私のコードの一部関係:

`FROM bmb_blog_post as post 
LEFT OUTER JOIN bmb_blog_category_bmb_blog_post_rel as posts_categories ON posts_categories.post_id = post.id 
LEFT OUTER JOIN bmb_blog_category as category ON category.id = posts_categories.category_id 
LEFT OUTER JOIN bmb_blog_post_bmb_blog_tag_rel as posts_tags ON posts_tags.post_id = post.id 
LEFT OUTER JOIN bmb_blog_tag as tag ON tag.id = posts_tags.tag_id` 

PgAdmin SQL Results Screenshot

答えて

0

私が正しく理解していれば、その方法は前にを集約2つのサブクエリであり、最終的にやってジョイン:

SELECT p.id, pc.categories, pt.tags 
FROM bmb_blog_post p LEFT OUTER JOIN 
    (SELECT pc.post_id, array_agg(c.category) as categories 
     FROM bmb_blog_category_bmb_blog_post_rel pc JOIN 
      bmb_blog_category c 
      ON c.id = pc.category_id 
     GROUP BY pc.post_id 
    ) pc 
    ON pc.post_id = p.id LEFT OUTER JOIN 
    (SELECT pt.post_id, array_agg(t.tag) as tags 
     FROM bmb_blog_post_bmb_blog_tag_rel pt JOIN 
      bmb_blog_tag t 
      ON t.id = pt.tag_id 
     GROUP BY pt.post_id 
    ) pt 
    ON pt.post_id = p.id ; 

あなたならばあなたの結果はさらに異様だろう複数のカテゴリ複数のタグを持つ投稿がありました。

+1

これは機能します。問題は、私の問題を簡素化してヘルプを求めたかったことです。このソリューションは完全なコンテキストでは機能しません。私は完全な問題で別の質問を掲示します。あなたの答えをありがとう! – Olivb40

+0

@ Olivb40。 。 。現在の質問を変更してこの回答を無効にするのではなく、別の質問をしていただきありがとうございます。 –

+0

最後に、私はあなたに感謝していくつかの変更を成功させました。 PostgreSQLを使った私のFullText Searchの最適化に関する助けを求めるために、後で別の質問を投稿します。 – Olivb40

関連する問題