子类,根据子级id查询所有父类"/>
mysql查询单表树结构语句,根据父级id查询所有子类,根据子级id查询所有父类
数据库结构
-- 建表语句
CREATE TABLE `tree_table` (`id` int(11) NOT NULL AUTO_INCREMENT,`parent_id` int(11) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 插入记录
INSERT INTO `tree_table`(`id`, `parent_id`, `name`) VALUES (1, -1, '中国');
INSERT INTO `tree_table`(`id`, `parent_id`, `name`) VALUES (2, 1, '江苏');
INSERT INTO `tree_table`(`id`, `parent_id`, `name`) VALUES (3, 1, '安徽');
INSERT INTO `tree_table`(`id`, `parent_id`, `name`) VALUES (4, 2, '南京');
INSERT INTO `tree_table`(`id`, `parent_id`, `name`) VALUES (5, 3, '合肥');
INSERT INTO `tree_table`(`id`, `parent_id`, `name`) VALUES (6, 4, '玄武区');
INSERT INTO `tree_table`(`id`, `parent_id`, `name`) VALUES (7, 4, '秦淮区');
根据父级id查询所有子类
SELECT t3.*
FROM (SELECT t1.*, IF ( FIND_IN_SET( parent_id, @pids ) > 0, @pids := CONCAT( @pids, ',', id ), '0' ) AS is_childFROM tree_table AS t1,( SELECT @pids := 1 ) AS t2ORDER BY t1.id ASC
) t3
WHERE t3.is_child != '0'
语句解释:
SELECT @pids := 1
mysql中变量定义和赋值,“:=”就是赋值方式。
FIND_IN_SET(parent_id, @pids)
这个函数是:@pids中如果有parent_id的值,就返回对应的下标。
if(a > b, 1, 2)
这个是mysql中if判断语句:如果a > b成立,结果就是1,否则就是2。
CONCAT(@pids, ',', id)
这个是字符串拼接函数。
语句总结:
1、将表中所有数据都查询出来,赋予变量@pids初始值为 待查询的父级id,并按照id正序排列;
2、通过if判断语句,将满足父子关系的id以逗号拼接到@pids变量并赋值给is_child,不满足条件的赋值为0;
3、再次查询t3表,将is_child=0的数据过滤掉。
根据子级id查询所有父类
SELECT t3.*
FROM (SELECT t1.*, IF ( FIND_IN_SET( id, @pids ) > 0, @pids := CONCAT( parent_id, ',', @pids ), '0' ) AS is_parentFROM tree_table AS t1,( SELECT @pids := 7 ) AS t2ORDER BY t1.id DESC
) t3
WHERE t3.is_parent != '0'
语句总结:
1、将表中所有数据都查询出来,赋予变量@pids初始值为 待查询的子级id,并按照id逆序排列;
2、通过if判断语句,将满足父子关系的parent_id以逗号拼接到@pids变量并赋值给is_parent,不满足条件的赋值为0;
3、再次查询t3表,将is_parent=0的数据过滤掉。
更多推荐
mysql查询单表树结构语句,根据父级id查询所有子类,根据子级id查询所有父类
发布评论