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

MySQL中存储为双向链表的表如何按prev_id、next_id定义顺序查询

MySQL双向链表结构数据按顺序查询方案

方案1:MySQL 8.0及以上版本(递归CTE实现,逻辑清晰性能最优)

利用MySQL 8.0支持的递归公用表达式,从链表头节点开始逐层遍历生成排序序号,最终按序号输出即可:

WITH RECURSIVE linked_list AS (
    -- 取链表首节点(prev_id为0的记录)作为递归起点
    SELECT id, prev_id, next_id, title, 1 AS sort_seq
    FROM tmp
    WHERE prev_id = 0
    UNION ALL
    -- 递归匹配下一条节点,排序序号逐次+1
    SELECT t.id, t.prev_id, t.next_id, t.title, ll.sort_seq + 1
    FROM tmp t
    INNER JOIN linked_list ll ON t.prev_id = ll.id
)
SELECT id, prev_id, next_id, title
FROM linked_list
ORDER BY sort_seq ASC;

用提供的测试数据执行上述SQL,输出顺序会严格按照链表定义返回:1、2、3、10、5、6,和title的序号完全匹配。

方案2:MySQL 5.x版本(用户变量实现,兼容旧版本)

如果使用不支持CTE的旧版本MySQL,可以通过用户变量遍历生成排序序号实现:

SELECT id, prev_id, next_id, title
FROM (
    SELECT 
        t.*,
        @sort_seq := @sort_seq + 1 AS sort_seq
    FROM tmp t
    JOIN (
        -- 初始化变量:@current_id为链表首节点ID,@sort_seq初始排序序号为0
        SELECT @current_id := (SELECT id FROM tmp WHERE prev_id = 0), @sort_seq := 0
    ) AS init
    WHERE id = @current_id AND (@current_id := next_id) IS NOT NULL
) AS ordered_list
ORDER BY sort_seq ASC;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:54:04