本文摘自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 jdbc连接步骤及常见参数
mysql server如何关闭
mysql 的常用命令有哪些
mysql 数据库 索引和事务
mysql 字符串拆分操作(含分隔符的字符串截取)
mysql 如何将timestamp转换为date
设计性能更优mysql 数据库schema
mysql 如何修改表字符编码
详解mysql 基本操作语句命令
mysql 实现连续签到断签一天从头开始方法实例
更多相关阅读请进入《mysql 》频道 >>
¥41.1元 机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » 如何让MySQL中单句实现无限层次父子关系查询