求助~,如何使用SQL语句,将评论和回复表的数据组成树形结构

一,问题描述
设计一个帖子,帖子有评论和回复功能。根据网上及自己的一个思考,设计两张表用来记录评论和回复。

comment 表:

clipboard.png

comment_reply 表:

clipboard.png

二,尝试解决方案

clipboard.png

三,预期效果

能够实现类似以下的查询结果

clipboard.png

此结果来源于:原文链接

四,测试表及数据

commment 表

CREATE TABLE `comment` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `topic_id` int(10) unsigned DEFAULT NULL COMMENT '主题id',
  `topic_type` tinyint(2) unsigned NOT NULL DEFAULT '1' COMMENT '1为课程,2为集会,3为商品',
  `content` text COMMENT '评论内容',
  `from_uid` int(10) unsigned DEFAULT NULL COMMENT '评论者id,一般为会员表的id',
  `nickname` varchar(60) DEFAULT NULL COMMENT '冗余用户昵称',
  `thumb_img` varchar(255) DEFAULT NULL COMMENT '冗余用户头像',
  `is_top` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '是否置顶评论,1为置顶,0为不置顶',
  `is_hot` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '是否为热评,1为热评',
  `like_num` int(5) unsigned DEFAULT '0' COMMENT '评论被点赞的次数',
  `reply_num` int(5) unsigned DEFAULT '0' COMMENT '评论被回复的次数',
  `is_reply` tinyint(2) unsigned DEFAULT '0' COMMENT '是否回复',
  `status` tinyint(2) unsigned NOT NULL COMMENT '评论状态,-1为删除,0为待审核,1为已发布',
  `create_time` int(11) unsigned DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `topic_id` (`topic_id`) USING BTREE,
  KEY `topic_type` (`topic_type`) USING BTREE,
  KEY `from_id` (`from_uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
INSERT INTO `dino_comment` VALUES (3, 4, 1, '第二条评论呗', 11, 'XXX', '', 0, 0, 0, 0, 0, 0, 1500797019);
INSERT INTO `dino_comment` VALUES (5, 4, 1, '我是的是的收到', 11, 'xxx', '', 0, 0, 0, 0, 0, 0, 1500898572);

comment_reply 表


Create Table

CREATE TABLE `comment_reply` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `comment_id` int(10) unsigned DEFAULT NULL COMMENT '评论id',
  `reply_type` tinyint(2) unsigned DEFAULT '1' COMMENT '1为回复评论,2为回复别人的回复',
  `reply_id` int(10) unsigned DEFAULT NULL COMMENT '回复目标id,reply_type为1时,是comment_id,reply_type为2时为回复表的id',
  `content` text CHARACTER SET utf8 COMMENT '回复内容',
  `to_uid` int(10) unsigned DEFAULT NULL COMMENT '回复目标id',
  `from_uid` int(10) unsigned DEFAULT NULL COMMENT '回复用户id',
  `from_thumb_img` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '回复者的头像',
  `from_nickname` varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT '回复者的昵称',
  `create_time` int(11) unsigned DEFAULT NULL COMMENT '评论时间',
  `to_nickname` varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT '冗余回复对象的昵称',
  `is_author` tinyint(2) unsigned DEFAULT NULL COMMENT '0为普通回复,1为后台管理员回复',
  PRIMARY KEY (`id`),
  KEY `comment_id` (`comment_id`) USING BTREE,
  KEY `from_uid` (`from_uid`) USING BTREE,
  KEY `to_uid` (`to_uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

INSERT INTO comment_reply` VALUES (8, 5, 1, 5, '好的,谢谢你支持', NULL, 1, NULL, '讲师', 1500898622, NULL, 1);
INSERT INTO comment_reply` VALUES (9, 5, 1, 5, '还有什么问题吗', NULL, 1, NULL, '讲师', 1500898683, NULL, 1);

求求各路大神指点迷津!!谢谢

阅读 5k
3 个回答

首先comment 一个ID 为xxx,再去comment_reply找回复评论的,reply_id 和reply_type=1,找到后再找每个回复评论下的 回复 reply_id和reply_type=2,一直for循环下去,查到就插入nodes下面

先把数据读出来,再用PHP递归,mysql做递归不是很友好

laravel 的orm 模型关联关系可以实现

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题