0

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


结构

只有重要的列。

注释

  • comment_id
  • comment_parent_id
  • 用户身份
  • 评论文本

帖子

  • post_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_idoncomments的评论有联系,NULL因为其他所有评论都只是另一个评论的孩子。


我正在努力处理查询,结果将给我分配给特定帖子 (by post_id) 及其子项的评论。

我试图从哪里选择comments并加入comments_to_postpost_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

comments_to_posts

comment_id post_id
1          10
4          20

预期结果

... where post_id = 10

comment_id
1
2
3
4

2 回答 2

1

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

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

于 2013-09-08T20:46:58.910 回答
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)

首先获取父评论,然后获取孩子,然后将它们全部联合起来。请参阅演示小提琴

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
于 2013-09-08T20:54:58.007 回答