如下,这是评论表数据
id 评论id
type 评论类型 对文章1,对用户2 评论
target_id 被评论者id
pid 为了关联评论,父id
from_id 评论者id
from_name 评论者昵称
。。。。。
我的思路是,
- 根据type和target_id先做查询,
比如先拿文章类型type=1 和被评论者id target_id=002查询
会查出三条数据 id为1,2,3的前三条 - 然后再根据from_id (评论者id),查询pid为from_id的数据
比如pid为1111的下面有两条数据,分别是id为4,和6
就把这两条数据插到一个children里放到1111下 - 同样同第二步,再查询 1114, 下面还有一条评论,把id为5的评论放到children里放到1114里
这样做合理吗,下面是部分中心代码,递归查询的时候存在问题
// 分页获取评论列表
function queryCommentList(req, res, next) {
const err = validationResult(req);
// 如果验证错误,empty不为空
if (!err.isEmpty()) {
// 获取错误信息
const [{ msg }] = err.errors;
// 抛出错误,交给我们自定义的统一异常处理程序进行错误返回
next(boom.badRequest(msg));
} else {
let { pageSize, pageNo, target_id, type } = req.body;
// 默认值
pageSize = pageSize ? pageSize : 5; // 每页几条
pageNo = pageNo ? pageNo : 1; // 第几页
let start = (pageNo - 1) * pageSize; // 起始位置
let query = `select * from comments_info where type = ${type} and target_id = ${target_id} order by create_time desc limit ${start},${pageSize}`;
querySql(query).then((data) => {
if (!data || data.length === 0) {
res.json({
code: CODE_ERROR,
msg: "暂无数据",
data: null,
});
} else {
let need = recursiveFind(data);
res.json({
code: CODE_SUCCESS,
msg: "查询数据成功",
data: {
data: [...data],
pageNo: parseInt(pageNo),
pageSize: parseInt(pageSize),
},
});
}
});
}
}
// 递归查询程序
function recursiveFind(data) {
for (let i = 0; i < data.length; i++) {
let query = `select * from comments_info where pid = ${data[i].from_id} order by create_time desc`;
querySql(query).then((reply) => {
if (reply.length) {
data[i].children = reply;
} else {
data[i].children = [];
}
// if(data[i].children.length) {
// recursiveFind(data[i].children)
// }
});
}
setTimeout(() => {
console.log(data);
}, 2000);
}
可以sql层面直接搞定,参考:
https://stackoverflow.com/que...
https://dev.mysql.com/doc/ref...