mysql樹形結構,根據pid獲取所有子級ID
阿新 • • 發佈:2019-02-15
直接上程式碼(注意一點,這裡的ID是自增的,並且需要父級的ID比子級的ID小)
建表(只做示例,可以自己擴充套件其他欄位):
CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '選單id', `parent_id` int(11) DEFAULT NULL COMMENT '父節點id', `menu_name` varchar(128) DEFAULT NULL COMMENT '選單名稱', `menu_url` varchar(128) DEFAULT '' COMMENT '選單路徑', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
模擬資料:
INSERT INTO `menu` VALUES ('0', null, '選單0', '選單0'); INSERT INTO `menu` VALUES ('1', '0', '選單1', '選單1'); INSERT INTO `menu` VALUES ('11', '1', '選單11', '選單11'); INSERT INTO `menu` VALUES ('12', '1', '選單12', '選單12'); INSERT INTO `menu` VALUES ('13', '1', '選單13', '選單13'); INSERT INTO `menu` VALUES ('111', '11', '選單111', '選單111'); INSERT INTO `menu` VALUES ('121', '12', '選單121', '選單121'); INSERT INTO `menu` VALUES ('122', '12', '選單122', '選單122'); INSERT INTO `menu` VALUES ('1221', '122', '選單1221', '選單1221'); INSERT INTO `menu` VALUES ('1222', '122', '選單1222', '選單1222'); INSERT INTO `menu` VALUES ('12211', '1222', '選單12211', '選單12211');
查詢sql(@pids := 查詢的父級ID
):
SELECT c.id FROM ( SELECT a.id, IF ( FIND_IN_SET(a.parent_id ,@pids) > 0, IF ( length(@pids) - length( REPLACE (@pids, a.parent_id, '') ) > 1, IF ( length(@pids) - length(REPLACE(@pids, a.id, '')) > 1 ,@pids ,@pids := concat(@pids, ',', a.id) ) ,@pids := concat(@pids, ',', a.id) ), 0 ) AS 'plist', IF ( FIND_IN_SET(a.parent_id ,@pids) > 0, @pids, 0 ) AS ischild FROM ( SELECT r.id, r.parent_id FROM menu r ) a, (SELECT @pids := 1) b ) c WHERE c.ischild != 0
查詢結果:
注:如果想把父級ID也加上 在上面SQL的最上面加上SELECT 1 FROM DUAL UNION ALL
(1為父級ID)
返回一個欄位,以逗號分隔(包括查詢的父級,@pids := 查詢的父級ID
):
SELECT
*
FROM
(
SELECT
c.plist
FROM
(
SELECT
a.id,
IF (
FIND_IN_SET(a.parent_id ,@pids) > 0,
IF (
length(@pids) - length(
REPLACE (@pids, a.parent_id, '')
) > 1,
IF (
length(@pids) - length(REPLACE(@pids, a.id, '')) > 1 ,@pids ,@pids := concat(@pids, ',', a.id)
) ,@pids := concat(@pids, ',', a.id)
),
0
) AS 'plist',
IF (
FIND_IN_SET(a.parent_id ,@pids) > 0,
@pids,
0
) AS ischild
FROM
(
SELECT
r.id,
r.parent_id
FROM
menu r
) a,
(SELECT @pids := 1) b
) c
WHERE
c.ischild != 0
ORDER BY
c.id DESC
LIMIT 0,
1
) d
查詢結果: