MySQL中可能的递归解决方案,用于查找评论和回复

时间:2015-06-15 05:39:48

标签: mysql

不是(可能)递归解决方案,但我多次遇到过这个问题。我有一个名为post_comments的表,如下所示:

Table: post_comments
comment_id    comment_text    user_id    parent_id    type
1                'x'             1           15         1
2                'hi'            2            1         2
3                'yo'            5           15         1
4                'hey'           3           1          2

基本上,类型为TINYINT(1)列。如果type为2,则表示对注释的回复。如果type为1,则是对帖子的评论。像这样:

Post: 'texttexttextloremipsmu' by some uuser
Comments:
     'x' <- Type 1
         'yo' <- Type 2, reply to 'x'

如果type为2,则表示parent_id引用表post_comments中的一些comment_id。如果为1,则引用帖子表posts中的帖子(未显示)。我需要一个SQL查询,可以找到post_id = 15的帖子(即)的所有评论和回复。它需要返回类似UNION GROUP BY的内容,其中伪代码为:

SELECT comment_id, type FROM post_comments WHERE parent_id = 15 and type = 1
UNION GROUP BY comment_id
SELECT comment_id FROM post_comments WHERE parent_id = comment_id
ORDER BY likes or date_posted (some arbitrary field)

要获得(基本上第一行是评论,下面是评论的回复,这一直持续到列出所有回复并且没有其他评论)

comment_id   type
1             1
2             2
4             2
3             1

如何在一个查询中完成此操作?或者我的数据库结构有什么问题导致了这个问题?同样,最大嵌套可能是1(因为没有对回复的回复,只回复评论)

1 个答案:

答案 0 :(得分:1)

这样可行:

SELECT * FROM 
(SELECT comment_id as new_id,comment_text from `post_comments` WHERE `type` = 1) as parent
UNION ALL
SELECT * FROM 
(SELECT parent_id as new_id,comment_text from `post_comments` WHERE `type` = 2) as child
ORDER BY `new_id`

我基本上做的是将每个类型视为一个单独的表并根据公共ID加入它们,我必须创建一个新列(new_id)才能使用它进行排序,但是你有一个问题将是评论首先出现的内容,因此我建议您添加created_on_date列,以便将其用作第二个索引进行排序。

P.S。花了我差不多一个小时才能找到你:D