2017-01-25 10 views
2

Контекст: У меня есть стол POST, связанный с TAGS и КАТЕГОРИЯМИ (все многие отношения). Я хочу возвращать сообщения, даже если у них нет ТЕГИ или КАТЕГОРИЙ, как в соответствующих массивах.PostgreSQL - 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

Если я правильно понимаю, то путь есть с двумя подзапросов, где вы агрегировать перед тем делает окончательный присоединяется:

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

Наконец-то мне удалось добиться нескольких изменений благодаря вам. Я отправлю еще один вопрос позже, чтобы спросить о помощи в оптимизации моего FullText Search с PostgreSQL. – Olivb40

 Смежные вопросы

  • Нет связанных вопросов^_^