我看了你的sqlfiddle,得出了以下结论。
您的代码的问题是,您使用的是 NULL 值。
查看这个 sqlfiddle 以查看一个工作示例:http://sqlfiddle.com/#!2/07ef7/1/0
我对您的陈述进行了一些更正,现在一切正常。
这是我所做的更改的列表:
- 在 create 语句中将“
parent_id bigint(11) unsigned DEFAULT NULL”更改为“parent_id bigint(11) unsigned NOT NULL DEFAULT 0”
- 删除外键约束,但我没有让它使用“0”作为 parent_id
- 插入“0”而不是“NULL”作为 parent_id
- 在 FUNCTION 中将数据类型 INT 更改为 BIGINT,因为您在创建语句中使用此类型
- 从 select 语句中删除 WHERE 子句
希望对你有帮助!
这里是语句,以防 sqlfiddle 现在不工作:
CREATE TABLE `Category` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`parent_id` bigint(11) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
KEY `ix_hierarchy_parent` (`parent_id`, `id`)
)//
INSERT INTO `Category` (`id`, `name`, `parent_id`)
VALUES
(1,'Cat Name 1',0),
(2,'Cat Name 2',0),
(3,'Cat Name 3',2),
(4,'Cat Name 4',2),
(7,'Cat Name 5',4),
(8,'Cat Name 6',4),
(9,'Cat Name 7',4),
(10,'Cat Name 8',4),
(11,'Cat Name 9',4),
(12,'Cat Name 10',4),
(13,'Cat Name 11',2),
(16,'Cat Name 12',13),
(17,'Cat Name 13',13),
(18,'Cat Name 14',13),
(19,'Cat Name 15',13),
(20,'Cat Name 16',13),
(21,'Cat Name 17',13)//
CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value BIGINT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE _id BIGINT;
DECLARE _parent_id BIGINT;
DECLARE _next BIGINT;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;
SET _parent_id = @id;
SET _id = -1;
IF @id IS NULL THEN
RETURN NULL;
END IF;
LOOP
SELECT MIN(id)
INTO @id
FROM `Category`
WHERE parent_id = _parent_id
AND id > _id;
IF @id IS NOT NULL OR _parent_id = @start_with THEN
SET @level = @level + 1;
RETURN @id;
END IF;
SET @level := @level - 1;
SELECT id, parent_id
INTO _id, _parent_id
FROM `Category`
WHERE id = _parent_id;
END LOOP;
END//
SELECT CONCAT(REPEAT(' ', level - 1), CAST(hi.id AS CHAR)) AS treeitem, hi.name, parent_id, level
FROM (
SELECT hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level
FROM (
SELECT @start_with := 0,
@id := @start_with,
@level := 0
) vars, `Category`
WHERE @id IS NOT NULL
) ho
JOIN `Category` hi
ON hi.id = ho.id