mysql 菜单数据递归查询sql怎么写, 不是mysql 8 版本,没有level字段 使用parent_id 查询、
时间: 2024-05-08 22:20:44 浏览: 206
MySQL通过自定义函数实现递归查询父级ID或者子级ID
5星 · 资源好评率100%
假设你的菜单表结构如下:
```
CREATE TABLE menu (
id INT PRIMARY KEY,
name VARCHAR(50),
parent_id INT
);
```
其中,`id` 是菜单项的唯一标识,`name` 是菜单项的名称,`parent_id` 是这个菜单项的父菜单项的 ID。如果一个菜单项没有父菜单项,则其 `parent_id` 为 NULL。
下面是一种递归查询菜单的 SQL 语句:
```
WITH RECURSIVE cte_menu AS (
SELECT id, name, parent_id
FROM menu
WHERE parent_id IS NULL
UNION ALL
SELECT m.id, m.name, m.parent_id
FROM menu m
JOIN cte_menu c ON m.parent_id = c.id
)
SELECT id, name, parent_id
FROM cte_menu;
```
这个 SQL 语句使用了 MySQL 中的递归公共表表达式(Recursive Common Table Expression,简称 CTE)。它首先找到所有根菜单项(即 `parent_id` 为 NULL 的菜单项),然后递归地查询它们的子菜单项,直到所有菜单项都被查询出来。
在递归查询过程中,我们使用 `JOIN` 操作将菜单表和递归查询的临时表连接起来,从而得到当前菜单项的子菜单项。最终,我们从递归查询的临时表中选择所有菜单项的 ID、名称和父菜单项的 ID。
需要注意的是,递归查询可能会导致性能问题。如果你的菜单项比较少,那么这个 SQL 语句应该可以满足你的需求。如果菜单项比较多,那么你可能需要考虑使用其他技术,比如嵌套集模型或者闭包表。
阅读全文