Php 如何从MySQL表中获取嵌套结果并链接到另一个表?

Php 如何从MySQL表中获取嵌套结果并链接到另一个表?,php,mysql,Php,Mysql,我有一个意见表: 注释id int(11)无自动增量 配置文件id int(11)编号 输入字符(1)拉丁文1\u瑞典文\u ci编号 家长id int(11)否 text mediumtext拉丁语1_瑞典语_ci编号 日期时间日期时间编号 投票得分(11) 其中“类型”可以是“a”,即对文章的评论,或“c”,即对评论(回复)的评论 “parent\u id”表示注释是文章\u id=1的子项还是注释\u id=1的子项 它链接到表“profiles”,其中comments.profile

我有一个意见表:


注释id int(11)无自动增量
配置文件id int(11)编号
输入字符(1)拉丁文1\u瑞典文\u ci编号
家长id int(11)否
text mediumtext拉丁语1_瑞典语_ci编号
日期时间日期时间编号
投票得分(11)


其中“类型”可以是“a”,即对文章的评论,或“c”,即对评论(回复)的评论

“parent\u id”表示注释是文章\u id=1的子项还是注释\u id=1的子项

它链接到表“profiles”,其中comments.profile\u id=profile.profile\u id(例如,我可以获取profile.first\u name)


挑战:

我想得到一个SQL查询,它按照注释的显示顺序为我提供注释:

评论1[类型=a]

(对评论1的答复)[类型=c]

(对评论2的答复)[类型=c]

评论2[类型=a]

我需要什么SQL查询来执行此操作?(目标是以正确的顺序返回结果,这样我就可以用一个简单的php WHILE循环打印结果。)


谢谢

我想您可能有兴趣阅读这篇关于的文章。使用此模型,执行问题中的简单操作的查询也很简单。 使用此模型,您的表结构如下所示:

comment_id int(11) No auto_increment
article_id int(11)
lft int NOT NULL
rgt int NOT NULL
profile_id int(11) No
text mediumtext No
datetime datetime No
vote_score int(11)
您的示例数据如下所示

comment_id article_id lft rgt profile_id text              datetime vote_score
------------------------------------------------------------------------------
     1         1       1   6      ?      comment 1            ?        ****
     2         1       2   3      ?      reply to comment1    ?         **
     3         1       4   5      ?      reply to comment2    ?        ****
     4         2       1   2      ?      comment2             ?         *
现在,使用此模型,以正确的顺序获取评论非常容易:

ORDER BY article_id, lft
我认为,切换到这个模型会让你省去很多递归的麻烦。玩得开心


附言:你是瑞典人吗?O:-)

我想你可能有兴趣阅读这篇关于的文章。使用此模型,执行问题中的简单操作的查询也很简单。 使用此模型,您的表结构如下所示:

comment_id int(11) No auto_increment
article_id int(11)
lft int NOT NULL
rgt int NOT NULL
profile_id int(11) No
text mediumtext No
datetime datetime No
vote_score int(11)
您的示例数据如下所示

comment_id article_id lft rgt profile_id text              datetime vote_score
------------------------------------------------------------------------------
     1         1       1   6      ?      comment 1            ?        ****
     2         1       2   3      ?      reply to comment1    ?         **
     3         1       4   5      ?      reply to comment2    ?        ****
     4         2       1   2      ?      comment2             ?         *
现在,使用此模型,以正确的顺序获取评论非常容易:

ORDER BY article_id, lft
我认为,切换到这个模型会让你省去很多递归的麻烦。玩得开心

附言:你是瑞典人吗?O:-)

一种方法:

SELECT pr.name_f,c1.comment_id AS comment_1, c1.profile_id AS profile_id_1, c1.type AS type_1, c1.parent_id AS parent_id_1, c1.text AS text_1, c1.datetime AS datetime_1, c1.vote_score AS score_1, c2.comment_id AS comment_2, c2.profile_id AS profile_id_2, c2.type AS type_2, c2.parent_id AS parent_id_2, c2.text AS text_2, c2.datetime AS datetime_2, c2.vote_score AS score_2 FROM profiles AS pr, comments AS c1 LEFT JOIN mcomments AS c2 ON c2.parent_id=c1.comment_id AND c2.comment_idc1.comment_id WHERE c1.article_id = '1' AND (pr.profile_id=c1.profile_id OR pr.profile_id=c2.profile_id) 选择pr.name_f,c1.comment_id作为comment_1,c1.profile_id作为profile_id_1,c1.type作为type_1,c1.parent_id作为parent_1,c1.datetime作为datetime_1,c1.vote_score作为score_1,c2.comment_id作为comment_2,c2.profile_id作为profile_id作为type_2,c2.type作为type_2,c2.parent_id作为parent_id作为parent_2,c2.text作为parent_id作为parent_2,日期时间,c2.将个人资料中的评分作为pr,将评论作为c1 将mcomcomments作为c2上的c2进行左连接。父项id=c1.comment\u id和c2.comment\u idc1.comment\u id 其中c1.article\u id='1'和(pr.profile\u id=c1.profile\u id或pr.profile\u id=c2.profile\u id) 然后,注释id的简单PHP数组可以防止发布重复/子注释

我相信有更好的方法吗?

一种方法:

SELECT pr.name_f,c1.comment_id AS comment_1, c1.profile_id AS profile_id_1, c1.type AS type_1, c1.parent_id AS parent_id_1, c1.text AS text_1, c1.datetime AS datetime_1, c1.vote_score AS score_1, c2.comment_id AS comment_2, c2.profile_id AS profile_id_2, c2.type AS type_2, c2.parent_id AS parent_id_2, c2.text AS text_2, c2.datetime AS datetime_2, c2.vote_score AS score_2 FROM profiles AS pr, comments AS c1 LEFT JOIN mcomments AS c2 ON c2.parent_id=c1.comment_id AND c2.comment_idc1.comment_id WHERE c1.article_id = '1' AND (pr.profile_id=c1.profile_id OR pr.profile_id=c2.profile_id) 选择pr.name_f,c1.comment_id作为comment_1,c1.profile_id作为profile_id_1,c1.type作为type_1,c1.parent_id作为parent_1,c1.datetime作为datetime_1,c1.vote_score作为score_1,c2.comment_id作为comment_2,c2.profile_id作为profile_id作为type_2,c2.type作为type_2,c2.parent_id作为parent_id作为parent_2,c2.text作为parent_id作为parent_2,日期时间,c2.将个人资料中的评分作为pr,将评论作为c1 将mcomcomments作为c2上的c2进行左连接。父项id=c1.comment\u id和c2.comment\u idc1.comment\u id 其中c1.article\u id='1'和(pr.profile\u id=c1.profile\u id或pr.profile\u id=c2.profile\u id) 然后,注释id的简单PHP数组可以防止发布重复/子注释


我确信有更好的方法吗?

树只有一个级别(只有父母才能有孩子),还是有多个级别(孩子也可以有孩子)?更新:多个级别。孩子可以有孩子。感谢IRCMaxell,例如,请参见此处的注释:树是否只有一个级别(只有父母才能有孩子),或者是否有多个级别(孩子也可以有孩子)?更新:多个级别。孩子可以有孩子。谢谢,例如,请参见此处的评论: