PostgreSQL-SELECT с двумя отношениями many2many



Контекст : У меня есть табличный пост, связанный с тегами и категориями (все отношения many2many). Я хочу возвращать сообщения, даже если у них нет тегов или категорий, как в соответствующих массивах.



Пример :



 - 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

735   1  

1 ответ:

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

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 ;

Ваши результаты были бы еще более странными, если бы у вас были сообщения, которые имели несколько категорий и несколько тегов.

Comments

    Ничего не найдено.