You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对含order、parent_id的pages表排序,使子页面紧跟对应父页面

解决方案

方案1:仅支持两级层级(父子两级),兼容所有支持关联查询的数据库

通过自关联拿到父页面的排序值,将同父子页面与父页面分到同一排序组后再区分父子优先级:

SELECT p.`id`, p.`title`, p.`order`, p.`parent_id`
FROM pages p
LEFT JOIN pages parent_p ON p.parent_id = parent_p.id
ORDER BY 
  COALESCE(parent_p.`order`, p.`order`), -- 第一优先级:按父页面order分组,同父子页面与父页面共享同一排序值
  p.parent_id IS NOT NULL, -- 第二优先级:父页面排在所属子页面之前
  p.`order` -- 第三优先级:同组内按当前页面自身order排序

方案2:支持无限级层级嵌套,适用于MySQL 8.0+/PostgreSQL/SQL Server等支持递归CTE的数据库

通过递归查询生成层级排序路径,无论嵌套多少层都能保证父页面排在所有子页面之前:

WITH RECURSIVE page_hierarchy AS (
  -- 递归初始节点:所有顶级页面
  SELECT id, title, `order`, parent_id, CAST(`order` AS CHAR(200)) AS sort_path
  FROM pages
  WHERE parent_id IS NULL
  UNION ALL
  -- 递归遍历子页面,拼接层级排序路径
  SELECT child.id, child.title, child.`order`, child.parent_id, CONCAT(parent.sort_path, '/', child.`order`)
  FROM pages child
  INNER JOIN page_hierarchy parent ON child.parent_id = parent.id
)
SELECT id, title, `order`, parent_id
FROM page_hierarchy
ORDER BY sort_path;

内容的提问来源于stack exchange,提问作者JoeCianflone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 11:00:05