MySQL邻接表复制节点时如何在SELECT中用IF和CONCAT加站点标题前缀
问题核心原因
你写的递归CTE存在字段顺序错位问题,导致标题判断逻辑失效:
UNION ALL 上下两部分的字段顺序必须严格对应,你上方锚点节点的查询字段顺序为 id, title, parent_id, new_id, new_parent_id,下方递归子节点的查询字段顺序写成了 id, n.parent_id, n.title,相当于把title字段的值存成了原节点的parent_id数值,自然匹配不到%Site%的判断条件。
修正后的完整查询语句
INSERT INTO node_structure_data (title,parent_id) WITH recursive max_id AS ( SELECT MAX(id) AS id FROM node_structure_data ), child_nodes AS ( SELECT n.id, n.title, n.parent_id, m.id+1 AS new_id, n.parent_id AS new_parent_id FROM node_structure_data n CROSS JOIN max_id AS m WHERE n.title='Site 1' UNION ALL SELECT n.id, n.title, -- 修正字段顺序:title放在第二个位置,和上方锚点查询字段对应 n.parent_id, -- 修正字段顺序:parent_id放在第三个位置 @row_num:=IF(@row_num=0,c.new_id,0) + 1 + @row_num AS new_id, c.new_id AS new_parent_id FROM child_nodes c INNER JOIN node_structure_data n ON n.parent_id = c.id CROSS JOIN ( SELECT @row_num:=0 AS rn ) AS vars ) -- 最终插入时加前缀判断:仅新父节点为1、标题含Site的节点加前缀 SELECT IF(new_parent_id = 1 AND title LIKE '%Site%', CONCAT('Copy of ', title), title) AS title, new_parent_id FROM child_nodes ORDER BY new_id;
调整说明
- 修正了递归子查询的字段顺序,保证和锚点查询的字段完全对应,避免字段值错位
- 最终插入的查询中新增判断逻辑,只有满足
new_parent_id=1(即直接挂在Division节点下的Site类复制节点)才会添加Copy of前缀,其余子节点保留原标题不变 - 原新ID生成逻辑、父子关联逻辑完全保留,不影响原有复制效果
内容的提问来源于stack exchange,提问作者Herker
相关产品推荐
相关产品推荐

