- 评论表的字段设计: 其实这里最重要的一个点就是如何区分一级还是二级。如果是一级评论parent_comment_id永远都是null,子评论的parent_comment_id则是回复的评论的id
id
user_id
Article_id
nickname
Avatar
content
like
Level:为一级评论时parent_comment_id为null,当为二级评论时parent_comment_id 为一级评论ID
parent_comment_id:回复的父级ID default null
create_timer
update_timer
2.具体sql代码如下:
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`user_id` int(4) NOT NULL COMMENT 'UserId',
`article_id` int(4) NOT NULL COMMENT 'articleId',
`parent_comment_id` INT(4) DEFAULT NULL COMMENT '父级评论ID',
`nickname` char(255) DEFAULT NULL COMMENT '昵称',
`avatar` char(255) DEFAULT NULL COMMENT '头像',
`content` CHAR(255) NOT NULL COMMENT '评论内容',
`like` SMALLINT(3) NOT NULL DEFAULT '0' COMMENT '点赞',
`Level` int(1) NOT NULL DEFAULT '0' COMMENT '评论层级',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='评论表';
3.查询一级和子评论sql代码如下:
SELECT `nickname`, `avatar`, `content`, `like`, `update_time`, `parent_comment_id`, `id`,
CASE WHEN EXISTS(SELECT 1 FROM `comments` WHERE `parent_comment_id`=c.id) THEN true ELSE false END AS `has_children`
FROM `comments` AS c
WHERE `article_id` = 6 AND `parent_comment_id` is null ORDER BY `create_time` DESC;
我在写上述sql的时候遇到的一些问题记录一下:
4.首先是sql的执行顺序:
- 1、FROM 语句选择那个表
- 2、WHERE 语句根据条件过滤数据
- 3、SELECT 语句根据WHERE语句获取到的数据,在看我们需要哪些字段返回相对应的数据回来
- 4、最后是SELECT 子语句也就是CASE WHEN 5.SELECT * FROM 和 SELECT 1 FROM的区别
- 这算是sql的一个优化点吧SELECT * FROM 会返回真实数据而1这不会
- SELECT 1 FROM时数据库引擎会执行查询,但是不需要检索真实的表数据,而只是返回一个简单的常量值 1。这样做可以避免浪费时间和资源去检索真实的数据,特别是当你只需要判断是否存在记录时。
5.EXISTS
- EXISTS:这个关键字用于检查子查询中是否存在记录。 (SELECT 1 FROM comments WHERE parent_comment_id = c.id):这是一个子查询,它检查 comments 表中是否存在满足条件 parent_comment_id = c.id 的记录。如果子查询返回至少一行记录,EXISTS 条件为真(TRUE),否则为假(FALSE)。
6.这里有一个小的点就是sql中boolean的true为1、false为0。我上述sql CASE WHEN 子语句中虽然返回的是true和false。但是执行完sql之后返回的还是1和0,sql特性。
7.IS NOT NULL 和 != null 的区别。
- 我在执行如下sql的时候发现一条数据都没有“SELECT
nickname,avatar,content,like,update_timeFROMcommentsWHEREparent_comment_id= null;” - 在sql中null是一个特殊的值,”代表缺少值或者未知“(说实话我也不是很理解),而不同于空字符串或零。
- 当定义的字段是字符串类型时用IS NOT NULL
- 当定义的是数字类型是用 != null