惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
爱范儿
爱范儿
罗磊的独立博客
美团技术团队
Jina AI
Jina AI
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
IT之家
IT之家
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
月光博客
月光博客
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)

蚊子的前端博客

微说 | 有的人觉得只要不考XX,一定能考好!-蚊子的前端博客 微说 | 春天来了-蚊子的前端博客 明天和意外不知道哪个先来-蚊子的前端博客 微说 | 既然错过了路口,就及时止损,重新规划路线上路-蚊子的前端博客 微说 | 2025年的出生人口数是792万-蚊子的前端博客 微说 | 工作年终总结,让写对接的接口的数量?-蚊子的前端博客 微说 | 温家宝:没有政治体制改革的成功 经济体制改革不可能进行到底-蚊子的前端博客 微说 | 违法犯罪了该不该被禁言?-蚊子的前端博客 微说 | 不明白为什么在推荐去俄罗斯旅游-蚊子的前端博客 微说 | 易中天论骗子-蚊子的前端博客 微说 | 一场大风吹散了秋天-蚊子的前端博客 微说 | 既要、又要、还要、更要!-蚊子的前端博客 又是一年的国庆雨季-蚊子的前端博客 微说 | 预估下2025年的出生人口数据-蚊子的前端博客 微说 | 可惜了我那些小时候的书本-蚊子的前端博客 微说 | 牛马有的是,驴不够了!-蚊子的前端博客 微说 | 能否有一条非户口也能高考的路-蚊子的前端博客 微说 | 小聊中医-蚊子的前端博客 微说 | 将要制作的一款新产品-蚊子的前端博客 微说 | 做人要有信-蚊子的前端博客 微说 | 好一个正义联盟-蚊子的前端博客 微说 | 都是见过吃过的主儿-蚊子的前端博客 微说 | 追求8小时工作制有错吗?-蚊子的前端博客 微说 | 如果尖锐的批评完全消失-蚊子的前端博客 微说 | 很好!-蚊子的前端博客 微说 | 封禁用户可以,但要告知具体原因-蚊子的前端博客 微说 | 面朝大海,春暖花开-蚊子的前端博客 微说 | 程序员的悲哀是什么?-蚊子的前端博客 微说 | 2025年出生人口的预测-蚊子的前端博客 前端在 LiveKit 中如何获取所有的参与者-蚊子的前端博客
评论回复在一张表里的评论系统如何进行分页-蚊子的前端博客
author · 2024-09-03 · via 蚊子的前端博客

我的博客的评论功能的实现,在之前的几篇文章中也有总结:

我在设计数据表时,是把所有的评论和回复都放在了同一张表中,之所以这么设计,主要是考虑到:

  1. 博客的数据量比较小,一张表就够了;
  2. 查询某文章下的评论时,查一次,就可以把所有评论和回复都查出来;

sql 语句:

SELECT c1.*, c2.nick as reply_nick, c2.face as reply_face
FROM comments c1
LEFT JOIN comments c2 ON c1.replyid = c2.id
WHERE c1.aid=?

查询出文章 id 下的所有评论,并且把回复的评论也查出来。若该评论的回复 id replyid 正好是某评论的 id,说明该评论是回复的某条评论,则把回复的评论的昵称、头像等数据也查出来。

但这种 SQL 语句的存在一个严重的问题:无法分页

假设每页的数据是 20 条,若我设置的 limit 为 20,其实查出来的是「评论+回复」一共 20 条,然后再形成楼中楼的结构后,当前页就不足 20 条数据了;而且还可能存在某条评论中的回复数据不全的问题。

那么该如何解决呢?

1. 查询出所有数据 #

就像上面的 sql 语句,把某文章里的所有评论数据都查出来,拼装成楼中楼的结构。要么后端根据页码分页后返回给前端;要么把所有数据返回给前端,前端自己进行分页。

其实在数据量不大的时候,这种做法没有问题,但是当数据量比较大的时候,每次都查询所有数据,然后再组装所有数据。速度肯定会逐渐慢下来。

2. 两次查询 #

既然「评论+回复」无法准确分页,那我们可以分成两次查询:

  1. 按照分页条数,查询出评论数据;
  2. 查询这些评论的所有回复的数据,这里不再分页;

大概的 SQL 语句如下:

# 查询评论数据,即replyid为null的数据
SELECT * FROM comments WHERE aid=? AND replyid IS NULL LIMIT ?, ?

再查询所有的回复数据:

# 将上面查到的所有评论的id给到当前语句
SELECT * FROM comments WHERE aid=? AND replyid IN (1,2,3)

然后将评论和回复的数据进行拼装。

3. 分成两张表 #

我们之前是把评论和回复放在一张表中。这里我们可以把评论数据和回复数据分别放到两张表里。类似于第 2 节中的两次查询,只不过这里查询的不同的数据表而已。