我有這個鄰接表模型表
桌子:
CREATE TABLE node_structure_data (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(455) NOT NULL,
parent_id INT(10) UNSIGNED DEFAULT NULL,
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES node_structure_data (id)
ON DELETE CASCADE ON UPDATE CASCADE
);
輸出:
id title parent_id
1 Division NULL
2 Site 1 1
3 Paper 2
4 ms1 3
5 Site 2 1
6 Paper 5
7 ms2 6
8 Site 3 1
9 Paper 8
10 ms3 9
所以我有以下查詢重復一個Site 1eg 及其子項。
在這種情況下,孩子們Paper用parent_id = 2,并ms1與parent_id = 3
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,
title,
parent_id,
m.id 1 AS new_id,
parent_id AS new_parent_id
FROM
node_structure_data n
CROSS JOIN
max_id AS m
WHERE
title='Site 1'
UNION ALL
SELECT
n.id,
n.parent_id,
n.title,
@row_num:=IF(@row_num=0,c.new_id,0) 1 @row_num AS new_id,
c.new_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
)
SELECT title,new_parent_id FROM child_nodes ORDER BY new_id;
輸出:
id title parent_id
1 Division NULL
2 Site 1 1
3 Paper 2
4 ms1 3
5 Site 2 1
6 Paper 5
7 ms2 6
8 Site 3 1
9 Paper 8
10 ms3 9
11 Site 1 1
12 Paper 11
13 ms1 12
正如你所看到的Site 1,它的孩子被復制了一個新的獨特的id.
但是,對于重復的Site標題,我想Copy of為 DUPLICATEDSite 1標題添加一個前綴文本,
我只想要一個前綴Site/parent_id = 1
這樣重復的節點應該是這樣的:
id title parent_id
1 Division NULL
2 Site 1 1
3 Paper 2
4 ms1 3
5 Site 2 1
6 Paper 5
7 ms2 6
8 Site 3 1
9 Paper 8
10 ms3 9
11 Copy of Site 1 1
12 Paper 11
13 ms1 12
我試圖在查詢中實作 IF 和 CONCAT,但由于某種原因,它不起作用,我沒有收到任何錯誤,但輸出保持不變。
IF(n.title LIKE '%Site%', CONCAT("Copy of ", n.title), n.title),
如果標題包含文本,Site那么我想聯系前綴和站點標題,否則沒有連接。
有任何想法嗎?
任何幫助表示贊賞!
uj5u.com熱心網友回復:
此解決方案展示了如何插入子樹的副本并重新標識后代。
INSERT INTO node_structure_data (id, title, parent_id)
WITH RECURSIVE subtree AS (
SELECT
id,
(SELECT MAX(id) FROM node_structure_data) AS last_id,
CONCAT('Copy of ', title) AS title,
parent_id
FROM node_structure_data
WHERE id = 2 -- i.e. title = 'Site 1'
UNION ALL
SELECT
n.id,
s.last_id,
n.title,
n.parent_id
FROM subtree s
JOIN node_structure_data n ON s.id = n.parent_id
), new_id AS (
SELECT
id,
last_id ROW_NUMBER() OVER (ORDER BY id) AS new_id,
title,
parent_id
FROM subtree
)
SELECT
n.new_id AS id,
n.title,
COALESCE(p.new_id, n.parent_id) AS parent_id
FROM new_id n
LEFT JOIN new_id p ON n.parent_id = p.id
請注意,不推薦使用 MySQL 8 在運算式中設定用戶變數,并將在未來版本中洗掉。
下面的小提琴顯示了每個 CTE 的結果 - db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/330813.html
