如何基于任务路径关联表对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;
逻辑解释
- 锚点成员:递归的起点,通过左连接任务路径表,找不到对应前置任务的就是整个链条的起始任务(比如你例子里的「The Start」),给它标记层级为1。
- 递归成员:每次从上一轮的结果里拿到当前任务,通过任务路径表找到它解锁的后续任务,层级在上一轮基础上加1,直到遍历完所有任务。
- 最终排序:按标记的
level字段排序,就能得到从起始到结束的完整任务承接顺序。
如果你的任务存在多条独立的任务链,这个方法也能自动识别每条链的起始点,分别排序后输出哦~
内容的提问来源于stack exchange,提问作者strykstaguy
相关产品推荐
相关产品推荐

