Разрешить несколько категорий с одинаковым именем со структурой вложенного набора

Основываясь на http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/, я изменил свою иерархию категорий для использования левого и правого значений. Это прекрасно работает, за исключением случаев, когда две категории имеют одинаковое имя.

CREATE TABLE `nested_category` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(80) DEFAULT NULL,
  `lft` int(11) NOT NULL DEFAULT '0',
  `rgt` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=28 ;

INSERT INTO `nested_category` VALUES(2, 'Reviews', 3, 20);
INSERT INTO `nested_category` VALUES(6, 'Music2', 24, 25);
INSERT INTO `nested_category` VALUES(18, 'Culture', 2, 21);
INSERT INTO `nested_category` VALUES(19, 'Music', 18, 19);

А потом:

SELECT node.name, (
COUNT( parent.name ) -1
) AS depth
FROM nested_category AS node, nested_category AS parent
WHERE node.lft
BETWEEN parent.lft
AND parent.rgt
GROUP BY node.name
ORDER BY node.lft
LIMIT 0 , 30

... дает:

name  depth 
Culture 0
Reviews 1
Music   2
Music2  0

... что идеально. Но если я поменяю "music2" на "music", я получу:

name  depth 
Culture 0
Reviews 1
Music   3

Любые идеи о том, как я могу сохранить правильную глубину вложения, но разрешить несколько категорий с одним именем?

1 ответ

Добавьте идентификатор к результату и GROUP BY чтобы сохранить уникальность вашего выбора.

SELECT node.name, id, (
COUNT( parent.name ) -1
) AS depth
FROM nested_category AS node, nested_category AS parent
WHERE node.lft
BETWEEN parent.lft
AND parent.rgt
GROUP BY node.name, id
ORDER BY node.lft
LIMIT 0 , 30
Другие вопросы по тегам