日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Mysql中的递归层次查询(父子查询,无限极查询)

發(fā)布時間:2023/11/28 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql中的递归层次查询(父子查询,无限极查询) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:最近面試的時候遇到公司要求只能用SQL來查詢無限極的數(shù)據(jù),不能用PHP程序做遞歸查詢,現(xiàn)在分享方法。

下面給出一個function來完成的方法

下面是sql腳本,想要運行的直接賦值粘貼進數(shù)據(jù)庫即可。

-- ---------------------------- 
-- Table structure for `treenodes` 
-- ---------------------------- 
DROP TABLE IF EXISTS `treenodes`; 
CREATE TABLE `treenodes` ( `id` int(11) NOT NULL, `nodename` varchar(20) DEFAULT NULL, `pid` int(11) DEFAULT NULL, PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- ---------------------------- 
-- Records of treenodes 
-- ---------------------------- 
INSERT INTO `treenodes` VALUES ('1', 'A', '0'); 
INSERT INTO `treenodes` VALUES ('2', 'B', '1'); 
INSERT INTO `treenodes` VALUES ('3', 'C', '1'); 
INSERT INTO `treenodes` VALUES ('4', 'D', '2'); 
INSERT INTO `treenodes` VALUES ('5', 'E', '2'); 
INSERT INTO `treenodes` VALUES ('6', 'F', '3'); 
INSERT INTO `treenodes` VALUES ('7', 'G', '6'); 
INSERT INTO `treenodes` VALUES ('8', 'H', '0'); 
INSERT INTO `treenodes` VALUES ('9', 'I', '8'); 
INSERT INTO `treenodes` VALUES ('10', 'J', '8'); 
INSERT INTO `treenodes` VALUES ('11', 'K', '8'); 
INSERT INTO `treenodes` VALUES ('12', 'L', '9'); 
INSERT INTO `treenodes` VALUES ('13', 'M', '9'); 
INSERT INTO `treenodes` VALUES ('14', 'N', '12'); 
INSERT INTO `treenodes` VALUES ('15', 'O', '12'); 
INSERT INTO `treenodes` VALUES ('16', 'P', '15'); 
INSERT INTO `treenodes` VALUES ('17', 'Q', '15');

把下面的語句直接粘貼進命令行執(zhí)行即可(注意修改傳入的參數(shù),默認rootId,表明默認treenodes)

根據(jù)傳入id查詢所有父節(jié)點的id

方法1:

級數(shù)不知道,可以用類似下面這個語句查詢,?@r := 6為查詢條件

SELECT T2.id, T2.nodename, T2.pid
FROM ( SELECT @r AS _id, (SELECT @r := pid FROM treenodes WHERE id = _id) AS pid, @l := @l + 1 AS lFROM (SELECT @r := 6, @l := 0) vars, treenodes h WHERE @r != 0) T1 
JOIN treenodes T2 
ON T1._id = T2.id 
ORDER BY T1.l;

結(jié)果:

?

方法2:

delimiter // 
CREATE FUNCTION `getParList`(rootId INT)
RETURNS varchar(1000) BEGINDECLARE sTemp VARCHAR(1000);DECLARE sTempPar VARCHAR(1000); SET sTemp = ''; SET sTempPar =rootId; #循環(huán)遞歸WHILE sTempPar is not null DO #判斷是否是第一個,不加的話第一個會為空IF sTemp != '' THENSET sTemp = concat(sTemp,',',sTempPar);ELSESET sTemp = sTempPar;END IF;SET sTemp = concat(sTemp,',',sTempPar); SELECT group_concat(pid) INTO sTempPar FROM treenodes where pid<>id and FIND_IN_SET(id,sTempPar)>0; END WHILE; RETURN sTemp; 
END
//

執(zhí)行命令

select * from treenodes where FIND_IN_SET(id,getParList(15));

結(jié)果:?

?

根據(jù)傳入id查詢所有子節(jié)點的id

delimiter // 
CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1000) BEGINDECLARE sTemp VARCHAR(1000);DECLARE sTempChd VARCHAR(1000);SET sTemp = '$';SET sTempChd =cast(rootId as CHAR);WHILE sTempChd is not null DOSET sTemp = concat(sTemp,',',sTempChd);SELECT group_concat(id) INTO sTempChd FROM  treeNodes where FIND_IN_SET(pid,sTempChd)>0;END WHILE;RETURN sTemp; 
END
//

執(zhí)行命令

select * from treenodes where FIND_IN_SET(id,getChildList(7));

結(jié)果:

?

總結(jié)

以上是生活随笔為你收集整理的Mysql中的递归层次查询(父子查询,无限极查询)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。