所以,让我们假设我有一个带有以下表格的MySQL数据库:
产品
分类
查询数据库的最佳方式是什么,以便从特定类别ID中删除所有产品。例如,如果我有一个子类别树,其中基类别id = 1
,我怎样才能获得id = 1
子类别下的所有产品以获得未确定数量的子类别 - 类别。
我可以这样做:
SELECT * FROM `Product` WHERE category_id IN (
SELECT `id` FROM `Category` WHERE parent_id = 1
)
但是它仅适用于类别为id = 1
的直接子项,而不适用于第二级到第n级子级。
谢谢。
修改
有些人建议阅读a blog article关于此问题,我也看了过去的那篇文章,并且我做了这个sqlfiddle:
http://sqlfiddle.com/#!2/be72ec/1
正如您在查询中看到的那样,即使是他们所教授的最简单的方法,获取类别树也不会输出任何内容。我错过了什么?其他方法也有同样的问题。
谢谢。
答案 0 :(得分:1)
我看着你的方式并得出以下结论。
您的代码的问题是,您使用的是NULL值。 查看此sqlfiddle以查看一个有效的示例:http://sqlfiddle.com/#!2/07ef7/1/0
我对你的陈述做了一些更正,现在一切正常 这是我所做的更改的列表:
parent_id
bigint(11)unsigned DEFAULT NULL”更改为“parent_id
bigint(11)unsigned NOT NULL DEFAULT 0,”在create statement 我希望能帮到你!
以下是声明,以防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