本文摘自PHP中文网,作者jacklove,侵删。
在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询;在不支持CTE表达式的版本中,借助函数递归也可以轻松实现。 在 MySQL 中,这个需求的实例稍显复杂, MySQL 中没有支持递归的查询,没有表值函数,函数不支持递归,所以通常都是用循环实现,显得比较别扭。今天看到一个用单条语句实现的递归查询,想法独特,分享一下。
相关mysql视频教程推荐:《mysql教程》
表结构和数据
1
2
3
4
5
6
7
8
9
CREATE
TABLE
table1(id
int
,
name
varchar
(10), parent_id
int
);
INSERT
table1
VALUES
(1, ‘Home’, 0),
(2, ‘About’, 1),
(3, ‘Contact’, 1),
(4, ‘Legal’, 2),
(5, ‘Privacy’, 4),
(6, ‘Products’, 1),
(7, ‘Support’, 2);
查询 id = 5 的所有父级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
ID.
level
, DATA.*
FROM
(
SELECT
@id
as
_id,
(
SELECT
@id := parent_id
FROM
table1
WHERE
id = @id
)
as
_pid,
@l := @l+1
as
level
FROM
table1,
(
SELECT
@id := 5, @l := 0 ) b
WHERE
@id > 0
) ID, table1 DATA
WHERE
ID._id = DATA.id
ORDER
BY
level
;
根据这个父级查询方法,很容易可以写出查所有子级的,下面的查询 id=2 的所有子级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
ID.
level
, DATA.*
FROM
(
SELECT
@ids
as
_ids,
(
SELECT
@ids := GROUP_CONCAT(id)
FROM
table1
WHERE
FIND_IN_SET(parent_id, @ids)
)
as
cids,
@l := @l+1
as
level
FROM
table1,
(
SELECT
@ids :=’1’, @l := 0 ) b
WHERE
@ids
IS
NOT
NULL
) id, table1 DATA
WHERE
FIND_IN_SET(DATA.id, ID._ids)
ORDER
BY
level
, id
本文讲解了如何让MySQL中单句实现无限层次父子关系查询 ,更多相关内容请关注php中文网。
相关推荐:
带进度的SQL Server FileStream如何存取
当忘记 SQL Server 管理员密码该如何处理
浅析MySQL中concat以及group_concat的使用
以上就是如何让MySQL中单句实现无限层次父子关系查询 的详细内容,更多文章请关注木庄网络博客 !
相关阅读 >>
mysql 递归查询的3种实现方式实例
mysql 怎么创建密码错误
mysql 数据库快速入门基础学习(经典教程)
mysql 讲解navicat premium 15 激活版安装教程
如何通过mysql 查看数据库表容量大小
ubuntu安装mysql 的方法
mysql 数据库服务找不到怎么办
mysql 为什么不让删外键?
mysql 的索引和事务详细解读
mysql 中的布尔值,怎么存储false或true
更多相关阅读请进入《mysql 》频道 >>
¥41.1元 机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » 如何让MySQL中单句实现无限层次父子关系查询