1. 程式人生 > >mysql樹形結構,根據pid獲取所有子級ID

mysql樹形結構,根據pid獲取所有子級ID

直接上程式碼(注意一點,這裡的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

查詢結果:
在這裡插入圖片描述