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

如何基于任务路径关联表对MySQL的quests表进行排序

按任务承接顺序排序任务表的解决方案

嘿,这个需求其实挺典型的——要把没按顺序存储的任务表,按照任务解锁的承接逻辑排好序对吧?咱们可以用**递归CTE(公共表表达式)**来搞定,毕竟任务链是个链式的层级结构,递归刚好能顺着链条一步步遍历下去。

先明确前提

首先得假设你的任务路径表结构(你没给出具体结构,我先按常规场景来设定):比如这个表叫quest_unlocks,有两个核心字段:

  • prev_mission_id:前置任务的missionID(完成这个任务后解锁后续)
  • next_mission_id:被解锁的后续任务的missionID

如果你的任务路径表是用任务的id而不是missionID关联的,后面的SQL只要把关联字段换成id就行,逻辑是完全一致的。

具体SQL实现

咱们用递归CTE来遍历整个任务链,同时给每个任务标记层级,最后按层级排序就好:

WITH RECURSIVE quest_order AS (
    -- 第一步:找到任务链的起始点(没有任何前置任务的任务)
    SELECT 
        q.id, 
        q.title, 
        q.missionID, 
        1 AS level
    FROM quests q
    LEFT JOIN quest_unlocks u ON q.missionID = u.next_mission_id
    WHERE u.prev_mission_id IS NULL

    UNION ALL

    -- 第二步:递归遍历后续任务,层级逐次+1
    SELECT 
        q.id, 
        q.title, 
        q.missionID, 
        qo.level + 1 AS level
    FROM quests q
    JOIN quest_unlocks u ON q.missionID = u.next_mission_id
    JOIN quest_order qo ON u.prev_mission_id = qo.missionID
)
-- 最后按层级输出,就是任务的承接顺序了
SELECT id, title, missionID
FROM quest_order
ORDER BY level;

逻辑解释

  1. 锚点成员:递归的起点,通过左连接任务路径表,找不到对应前置任务的就是整个链条的起始任务(比如你例子里的「The Start」),给它标记层级为1。
  2. 递归成员:每次从上一轮的结果里拿到当前任务,通过任务路径表找到它解锁的后续任务,层级在上一轮基础上加1,直到遍历完所有任务。
  3. 最终排序:按标记的level字段排序,就能得到从起始到结束的完整任务承接顺序。

如果你的任务存在多条独立的任务链,这个方法也能自动识别每条链的起始点,分别排序后输出哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:26:09