mysql更新组织机构层级
时间: 2023-09-07 13:17:44 浏览: 44
更新组织机构层级可以使用MySQL中的递归查询和更新语句。以下是一个例子,假设有一个名为`org`的表,其中包含组织机构的ID、名称、父级ID和层级:
```
CREATE TABLE org (
id INT PRIMARY KEY,
name VARCHAR(50),
parent_id INT,
level INT
);
INSERT INTO org VALUES (1, 'A', NULL, 1);
INSERT INTO org VALUES (2, 'B', 1, 2);
INSERT INTO org VALUES (3, 'C', 1, 2);
INSERT INTO org VALUES (4, 'D', 2, 3);
INSERT INTO org VALUES (5, 'E', 2, 3);
INSERT INTO org VALUES (6, 'F', 3, 3);
INSERT INTO org VALUES (7, 'G', NULL, 1);
INSERT INTO org VALUES (8, 'H', 7, 2);
INSERT INTO org VALUES (9, 'I', 8, 3);
```
现在我们想要更新每个组织机构的层级。我们可以使用以下查询语句:
```
UPDATE org o
JOIN (
SELECT id, IFNULL(parent_id, 0) AS parent_id, 1 AS level
FROM org
WHERE parent_id IS NULL
UNION ALL
SELECT o.id, o.parent_id, p.level + 1
FROM org o
JOIN (
SELECT id, level
FROM org
) p ON o.parent_id = p.id
) q ON o.id = q.id
SET o.level = q.level;
```
这个查询语句使用了递归,首先找到所有顶级组织机构(即`parent_id`为空的记录),并将它们的层级设置为1。然后,查询语句递归地将每个组织机构的层级设置为其父级组织机构的层级加1。最后,使用`JOIN`语句将查询结果与原始表进行连接,并使用`SET`语句更新每个组织机构的层级。
执行以上查询语句后,`org`表将会变成这样:
```
+----+------+-----------+-------+
| id | name | parent_id | level |
+----+------+-----------+-------+
| 1 | A | NULL | 1 |
| 2 | B | 1 | 2 |
| 3 | C | 1 | 2 |
| 4 | D | 2 | 3 |
| 5 | E | 2 | 3 |
| 6 | F | 3 | 3 |
| 7 | G | NULL | 1 |
| 8 | H | 7 | 2 |
| 9 | I | 8 | 3 |
+----+------+-----------+-------+
```
这里可以看到,每个组织机构的层级已经正确地更新了。