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

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;
调整说明
  1. 修正了递归子查询的字段顺序,保证和锚点查询的字段完全对应,避免字段值错位
  2. 最终插入的查询中新增判断逻辑,只有满足new_parent_id=1(即直接挂在Division节点下的Site类复制节点)才会添加Copy of 前缀,其余子节点保留原标题不变
  3. 原新ID生成逻辑、父子关联逻辑完全保留,不影响原有复制效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:39:03