MySQL中单句实现无限层次父子关系查询
2017-12-16 14:08
831 查看
在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询;在不支持CTE表达式的版本中,借助函数递归也可以轻松实现。
在 MySQL 中,这个需求的实例稍显复杂, MySQL 中没有支持递归的查询,没有表值函数,函数不支持递归,所以通常都是用循环实现,显得比较别扭。今天看到一个用单条语句实现的递归查询,想法独特,分享一下。
表结构和数据
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 的所有父级
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 的所有子级
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
(此文也在个人微信公共号ZJCXC发布)
在 MySQL 中,这个需求的实例稍显复杂, MySQL 中没有支持递归的查询,没有表值函数,函数不支持递归,所以通常都是用循环实现,显得比较别扭。今天看到一个用单条语句实现的递归查询,想法独特,分享一下。
表结构和数据
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 的所有父级
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 的所有子级
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
(此文也在个人微信公共号ZJCXC发布)
相关文章推荐
- php+mysql查询实现无限下级分类树输出示例
- MySQL查询倒数第二条记录实现方法
- 详解MySQL分组查询Group By实现原理(1)
- MySQL分组查询Group By实现原理详解
- 使用树形结构与CTE实现父子列多层次查询
- 解析Mysql多表查询的实现
- MySQL实现子查询过滤多列
- mysql 查询指定日期时间内sql语句实现原理与代码
- Mysql的Merge存储引擎实现分表查询
- 利用MySQL的一个特性实现MySQL查询结果的分页显示
- MySQL实现递归调用,查询组织架构树
- MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法
- MySQL 查询结果以百分比显示简单实现
- MySQL中如何实现Top N及M至N段的记录查询?
- 如何实现 MySQL 查询结合多个的 count () 和 GROUP BY
- MySQL递归层次查询
- 利用DataView.ToTable 方法 (String) 在结果中查询,可以实现无限次循环
- 使用MYSQL实现Oracle的Start with...Connect By递归树查询
- 在MySQL中,如何实现Top N及M至N段的记录查询?
- 实现MySQL top n查询的步骤