mysql5.7根据组织结构编码更新组织机构层级
时间: 2023-10-19 17:14:55 浏览: 47
假设你的组织结构表名为`organization`,其中包含以下字段:
| 字段名 | 类型 | 说明 |
| ------ | ---- | ---- |
| id | int | 主键 |
| name | varchar | 组织机构名称 |
| code | varchar | 组织机构编码 |
| parent_code | varchar | 父级组织机构编码 |
那么更新组织机构层级的SQL语句如下:
```sql
UPDATE organization AS o
JOIN organization AS p ON o.parent_code = p.code
SET o.level = CONCAT(p.level, '-', o.code)
WHERE o.parent_code IS NOT NULL;
```
该语句使用了MySQL的`CONCAT`函数将父级组织机构的层级和当前组织机构编码连接起来,形成当前组织机构的层级编码。同时使用了`JOIN`语句连接了组织机构表自身,以便获取父级组织机构的层级编码。最后使用`WHERE`子句过滤掉根节点(即`parent_code`为`NULL`的节点),确保只更新有父节点的组织机构层级。
相关问题
mysql5.7更新组织机构层级
如果你想要在 MySQL 5.7 中更新组织机构的层级,可以尝试以下步骤:
1. 创建一个新的表来存储组织机构的层级关系,例如:
```
CREATE TABLE org_hierarchy (
org_id INT NOT NULL,
parent_org_id INT,
level INT,
PRIMARY KEY (org_id)
);
```
在这个表中,`org_id` 表示组织机构的唯一标识,`parent_org_id` 表示当前组织机构的父级组织机构的标识,`level` 表示组织机构在整个层级结构中的层级深度。
2. 将现有的组织机构数据插入到新表中,可以使用递归查询来实现:
```
INSERT INTO org_hierarchy (org_id, parent_org_id, level)
WITH RECURSIVE cte AS (
SELECT org_id, parent_org_id, 0 AS level
FROM org
WHERE parent_org_id IS NULL
UNION ALL
SELECT o.org_id, o.parent_org_id, c.level + 1
FROM org o
JOIN cte c ON o.parent_org_id = c.org_id
)
SELECT org_id, parent_org_id, level FROM cte;
```
这个查询会递归地查询每一个组织机构,并且为每个组织机构计算出它在层级结构中的深度。
3. 更新现有的组织机构表,将父级组织机构的 ID 替换为新表中的对应 ID:
```
UPDATE org
JOIN org_hierarchy h ON org.org_id = h.org_id
SET org.parent_org_id = h.parent_org_id;
```
这个查询会将现有的组织机构表中的父级组织机构 ID 替换成新表中的对应 ID。
现在,你就可以通过新表 `org_hierarchy` 来查询组织机构的层级结构了。例如,如果你想要查询某个组织机构的所有下级组织机构,可以使用以下查询:
```
SELECT o.*
FROM org_hierarchy h
JOIN org o ON h.org_id = o.org_id
WHERE h.parent_org_id = :org_id;
```
其中,`:org_id` 是你想要查询下级组织机构的父级组织机构的 ID。
mysql更新组织机构层级
更新组织机构层级可以使用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 |
+----+------+-----------+-------+
```
这里可以看到,每个组织机构的层级已经正确地更新了。