node+mysql 在同一个表中根据某个值返回树状结构
时间: 2023-12-17 13:05:27 浏览: 92
获取树状结构的sql
如果你在 Node.js 中使用 MySQL,并且有一个包含父子关系的表,你可以使用递归查询来返回树状结构。以下是一个示例,假设我们有一个表 `departments`,其中包含 `id`,`name` 和 `parent_id` 这三个字段,`parent_id` 表示父部门的 `id`。
首先,我们需要使用 MySQL 模块连接到数据库。在示例中,我们使用 `mysql2` 模块连接到数据库,你也可以使用其他的 MySQL 模块。
```js
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test'
});
```
然后,我们可以使用递归函数来获取树状结构。以下是一个示例递归函数:
```js
async function getDepartmentTree(parentId) {
const [rows] = await connection.promise().query(
'SELECT id, name, parent_id FROM departments WHERE parent_id = ?',
[parentId]
);
const departments = [];
for (const row of rows) {
const department = {
id: row.id,
name: row.name,
children: await getDepartmentTree(row.id)
};
departments.push(department);
}
return departments;
}
```
该函数接收一个参数 `parentId`,表示要查询的父部门的 `id`。首先,该函数从数据库中查询所有 `parent_id` 为 `parentId` 的部门,并将查询结果存储在 `rows` 中。
然后,该函数使用一个循环遍历 `rows`,对于每个部门,它创建一个包含 `id`、`name` 和 `children` 的对象。`id` 和 `name` 来自查询结果,`children` 是一个递归调用 `getDepartmentTree` 的结果,其中传入的参数是当前部门的 `id`。递归调用会继续向下查询子部门,并返回子部门的树状结构。
最后,该函数返回一个数组 `departments`,其中包含所有查询到的部门的树状结构。如果要查询根节点的树状结构,可以将 `parentId` 设置为 `null`。
以下是一个示例调用该函数并打印结果:
```js
(async () => {
const departmentTree = await getDepartmentTree(null);
console.log(JSON.stringify(departmentTree, null, 2));
})();
```
该调用会返回所有部门的树状结构,并将其以 JSON 格式打印出来。
阅读全文