不是(可能)递归解决方案,但我多次遇到过这个问题。我有一个名为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(因为没有对回复的回复,只回复评论)
答案 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