這裏是存儲過程,你可以用它來獲取所有的父母在層次:
DROP PROCEDURE IF EXISTS sp_GetParentsByLevel;
delimiter $$
CREATE PROCEDURE `sp_GetParentsByLevel`(level_id varchar(36))
main : BEGIN
DECLARE P_ID VARCHAR(36) DEFAULT NULL;
DECLARE P_ID_ALL TEXT DEFAULT NULL;
DECLARE COUNT INT DEFAULT 0;
get_parents : LOOP
-- get the parent of current level
SELECT parent_id INTO P_ID FROM test1 WHERE cat_id = level_id;
-- if current level is parent level then leave the loop
IF P_ID = 0 THEN
LEAVE get_parents;
END IF;
-- set current parent id as level id for next iteration
SET level_id = P_ID;
-- concat all the parents id
IF COUNT = 0 THEN
SET P_ID_ALL = P_ID;
SET COUNT = COUNT+1;
ELSE
SET P_ID_ALL = CONCAT(P_ID_ALL,',',P_ID);
END IF;
END LOOP get_parents;
-- if parent exists then execute the query, else return empty set
IF P_ID_ALL IS NOT NULL THEN
-- create query to generate result set
SET @sqltext = CONCAT('SELECT cat_id, name, parent_id
FROM test1
WHERE cat_id IN (',P_ID_ALL,')');
-- execute query
PREPARE stmt FROM @sqltext;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END$$
mysql> CALL sp_GetParentsByLevel('3');
+--------+---------+-----------+
| cat_id | name | parent_id |
+--------+---------+-----------+
| 1 | cat1 | 0 |
| 2 | subcat1 | 1 |
+--------+---------+-----------+
2 rows in set (0.00 sec)
CALL sp_GetParentsByLevel( '3');
請替換表名。這個存儲過程可以用來獲取任意數量的父母。
MySQL沒有遞歸語法 - 請參閱此鏈接以獲取更多信息:http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html –
僅僅是我還是不是「Level」列冗餘? –
@Yzmir:取決於你如何分割這些數據。你可以計算它,但計算它可能相當醜陋(特別是在MySQL中)。 –