mysql级联查询机构树
时间: 2025-01-23 08:34:19 浏览: 58
### 如何在 MySQL 中实现机构树结构的级联查询
#### 使用递归公用表表达式 (CTE)
自 MySQL 8.0 版本起,引入了对递归公用表表达式的支持。这使得处理层次化数据变得更加简单高效。
对于树形结构的数据存储,通常会有一个 `id` 和一个指向父节点的 `parent_id` 字段。为了展示如何执行这样的查询,假设存在一张名为 `organization_tree` 的表格:
| id | name | parent_id |
|----|-------------|-----------|
| 1 | 总公司 | NULL |
| 2 | 分公司A | 1 |
| 3 | 部门X | 2 |
| 4 | 小组Y | 3 |
要获取给定父 ID 下的所有后代记录,可以采用如下 SQL 查询语句[^1]:
```sql
WITH RECURSIVE subordinates AS (
SELECT id, name, parent_id FROM organization_tree WHERE id = ?
UNION ALL
SELECT ot.id, ot.name, ot.parent_id
FROM organization_tree ot INNER JOIN subordinates s ON ot.parent_id = s.id
)
SELECT * FROM subordinates;
```
此查询中的问号 (`?`) 应替换为目标父节点的具体 ID 值。该 CTE 定义了一个名为 `subordinates` 的临时结果集,它首先选取指定根节点的信息,接着不断加入其直系子代直到没有更多的下层节点为止。
#### PHP 实现示例
当与 PHP 结合时,则可以通过 PDO 或 mysqli 扩展来准备并执行上述参数化的查询。下面是一个简单的例子说明怎样利用 PDO 来完成这项工作[^2]:
```php
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
function getSubtree($parentId){
global $pdo;
$stmt = $pdo->prepare("
WITH RECURSIVE subordinates AS (
SELECT id, name, parent_id FROM organization_tree WHERE id = :parentId
UNION ALL
SELECT ot.id, ot.name, ot.parent_id
FROM organization_tree ot INNER JOIN subordinates s ON ot.parent_id = s.id
)
SELECT * FROM subordinates;
");
$stmt->execute(['parentId' => $parentId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// 调用函数传入想要展开的节点ID
$subTreeData = getSubtree(1); // 这里以总公司为例
print_r($subTreeData);
?>
```
阅读全文
相关推荐


















