单表笔记论坛父子层级展示Order By排序逻辑实现求助
单表嵌套评论层级排序查询解决方案
核心思路
你的需求是两级评论(主评论+直接子评论)场景下,子评论紧跟对应主评论之后,按ID升序排列。核心排序逻辑是先按「根节点ID」排序:主评论的根ID为自身ID,子评论的根ID为对应的Parent值,同根下再按ID升序即可保证主评论在前、子评论在后。
适配低版本MySQL的两级场景写法
直接修改排序规则即可实现需求,无需关联查询:
SELECT * FROM employee_notes WHERE Employee_ID = '999' ORDER BY CASE WHEN Parent IS NULL THEN ID ELSE Parent END ASC, ID ASC;
该写法针对你的示例数据输出顺序为:ID 1(主评论)→ ID 3(ID1的子评论)→ ID5(主评论)→ ID7(主评论)→ ID9(ID7的子评论),完全符合预期。
兼容多层嵌套评论的扩展写法
如果后续需要支持子评论再被回复的多层嵌套场景,可使用MySQL 8.0+支持的递归CTE实现,额外返回的层级字段还可直接用于前端缩进渲染:
WITH RECURSIVE comment_tree AS ( -- 递归初始项:查询所有顶级主评论 SELECT *, ID AS root_id, 1 AS level FROM employee_notes WHERE Parent IS NULL AND Employee_ID = '999' UNION ALL -- 递归项:关联查询所有子级评论 SELECT c.*, ct.root_id, ct.level + 1 AS level FROM employee_notes c INNER JOIN comment_tree ct ON c.Parent = ct.ID WHERE c.Employee_ID = '999' ) SELECT * FROM comment_tree ORDER BY root_id ASC, level ASC, ID ASC;
原写法问题说明
你之前的左连接逻辑会导致主评论重复关联子评论出现冗余记录,且排序规则没有锚定根ID维度,因此无法将子评论归类到对应主评论下方。
内容的提问来源于stack exchange,提问作者user3258571
相关产品推荐
相关产品推荐

