前言
显示实现通过父id查询所有子id数据;第二部分同子id查询到最顶层根id(超级父id)
一、通过父id查询所有子id
1.数据库
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for t_parent
-- ----------------------------
DROP TABLE IF EXISTS `t_parent`;
CREATE TABLE `t_parent` (
`id` bigint NOT NULL,
`parent_id` bigint DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_parent
-- ----------------------------
INSERT INTO `t_parent` VALUES ('1', '0', '张三');
INSERT INTO `t_parent` VALUES ('2', '0', '李四');
INSERT INTO `t_parent` VALUES ('11', '1', '张三儿子');
INSERT INTO `t_parent` VALUES ('21', '2', '李四儿子');
INSERT INTO `t_parent` VALUES ('111', '11', '张三孙子');
表数据如下:
2.查询语句
SELECT t3.*
FROM(SELECT t1.*,
IF (FIND_IN_SET(parent_id, @pids) > 0,@pids := CONCAT(@pids, ',', id),'0') AS ischild
FROM(SELECT t.id,t.parent_id,t.NAME
FROM t_parent AS t
ORDER BY t.id ASC) t1,
(SELECT @pids := '0') t2) t3
WHERE ischild != '0'
使用时候把t_parent 改成自己表,@pids := '0’这个是要查询的父id号
查询结果:
3.SQL解释
SELECT @pids := '0'
这是mysql中变量定义和赋值,“:=”就是赋值方式,这种赋值方式一般和select连用
FIND_IN_SET(parent_id, @pids)
这个函数是:@pids中如果有parent_id的值,就返回对应的下标(下标从1开始)如下图
if(a > b, 1, 2)
这是mysql中if判断语句,语法是:如果a > b成立,结果就是1,否则就是2
CONCAT(@pids, ',', id)
CONCAT()是字符拼接函数
语句总结:
- 先把表中所有数据查询出来,并排好序(必须的)
IF (FIND_IN_SET(parent_id, @pids) > 0,@pids := CONCAT(@pids, ',', id),'0') AS ischild
通过这条判断语句,将满足父子关系的字符赋值给ischild,不满足的将’0’赋值给ischild- 再次查询,将ischild为’0’的筛选掉,剩下的就是满足要求的数据了
二、通过子id查询父id到根节点
1.查询语句
代码如下:
SELECT t3.*
FROM(SELECT t1.*,
IF (FIND_IN_SET(id, @ids) > 0,@ids := CONCAT( parent_id,',', @ids),'0') AS isparent
FROM(SELECT t.id,t.parent_id,t.NAME
FROM t_parent AS t
ORDER BY t.id DESC) t1,
(SELECT @ids := '111') t2) t3
WHERE t3.isparent != '0'
使用时候把t_parent 改成自己表,@ids := '111’这个是要查询的子id号,还有和查询父id不同的地方是ORDER BY t.id DESC,这里使用desc排序
查询结果: