树结构在...森林。如何通过森林ID检索树?

时间:2013-09-08 20:12:23

标签: mysql

问题本身可能写错了,所以如果有人更好地了解如何定义它,请编辑问题。


结构

只有重要的专栏。

评论

  • COMMENT_ID
  • comment_parent_id
  • USER_ID
  • COMMENT_TEXT

帖子

  • POST_ID
  • USER_ID
  • POST_TEXT

comments_to_post(comments_to_foos,comments_to_bars,...)

  • COMMENT_ID
  • post_id(foo_id,bar_id,...)

comments_to_post只包含与comment_parent_id comments上的NULLpost_id的评论的关联,因为其他评论只是其他评论的孩子。


我正在努力解决查询问题,结果会将评论分配给特定帖子(comments)及其子项。

我尝试从comments_to_post中选择并加入post_id = ? NULL,但难怪我只收到comment_parent_id comments_to_post的评论,因为只有他们通过comment_id comment_parent_id 1 NULL 2 1 3 1 4 NULL 5 4

如何将结果添加到那些儿童评论中?


示例数据:

评论

post_id
10
20

帖子

comment_id post_id
1          10
4          20

comments_to_posts

... where post_id = 10

comment_id
1
2
3

预期结果

{{1}}

2 个答案:

答案 0 :(得分:1)

您应该将字段post_id添加到表comments(在这种情况下,您不需要表comments_to_posts)。只有在这种情况下,您才能通过一个数据库请求选择所有注释和子注释。

另外,如果你想在树形结构中有一些数据(评论,菜单等),我建议你阅读http://en.wikipedia.org/wiki/Nested_set_model。解决这个问题是一种非常有趣和优雅的方法。

答案 1 :(得分:1)

更新 -

您可以在没有UNION的情况下执行此操作,如下所示。请注意,这两种方法仅适用于单级注释线程。

SELECT c.*
FROM comments_to_post ctp , comments c
WHERE ctp.post_id = 1
  AND ( c.comment_id = ctp.comment_id OR c.comment_parent_id = ctp.comment_id)

首先获取父评论,然后获取子项,并将它们全部UNION。见DEMO fiddle

SELECT c.*
FROM comments_to_post ctp , comments c
WHERE ctp.post_id = 1
  AND c.comment_id = ctp.comment_id

UNION ALL

SELECT c.*
FROM comments_to_post ctp , comments c
WHERE ctp.post_id = 1
  AND ctp.comment_id = c.comment_parent_id
ORDER BY comment_id