在嵌套树下计算项目的最有效方法

时间:2013-04-22 00:19:53

标签: mysql performance tree

所以我希望在我的网站上提供category (x)样式的产品计数。

我目前正在使用MySQL。

我的分类表如下: Categories (Id, TreeLeft, TreeRight, Level, Name) - “Level”是节点深度。

输入的类别如下所示: enter image description here

我的项目>类别关系表看起来像:  ItemCategories (ItemId, CategoryId)

假设我有:

  • 'TUBE'下的1项
  • 'LCD'下的2个项目
  • 'FLASH'下的1项
  • “2 WAY-RADIOs”下的1项

如何最有效地查询我的项目(大型数据库)+类别(4000 in db),以生成:

Electronics (5) 
 - Televisions (3)
   - Tube (1)
   - LCD (2)
 - Portable Electronics (2)
   - MP3 Players (1)
    - Flash (1)
   - 2 Way Radios (1)

注意只返回那些包含产品的类别,并正确地将它们计算在树上。

最值得赞赏的任何帮助。

编辑:数据库代码以在本地重新创建环境:

CREATE TABLE IF NOT EXISTS `Categories` (
  `Id` int(11) NOT NULL auto_increment,
  `TreeLeft` mediumint(7) NOT NULL,
  `TreeRight` mediumint(7) NOT NULL,
  `Level` tinyint(3) NOT NULL,
  `Name` varchar(255) NOT NULL,
  UNIQUE KEY `Id` (`Id`),
  KEY `TreeLeft` (`TreeLeft`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

INSERT INTO `Categories` (`Id`, `TreeLeft`, `TreeRight`, `Level`, `Name`) VALUES
(1, 1, 20, 1, 'Electronics'),
(2, 2, 9, 2, 'Television'),
(3, 10, 19, 2, 'Portable Electronics'),
(4, 3, 4, 3, 'Tube'),
(5, 5, 6, 3, 'LCD'),
(6, 7, 8, 3, 'Plasma'),
(7, 11, 14, 3, 'MP3 Players'),
(8, 15, 16, 3, 'CD Players'),
(9, 11, 14, 3, '2 Way Radios'),
(10, 12, 13, 4, 'Flash');

CREATE TABLE IF NOT EXISTS `ItemCategories` (
  `CategoryId` int(11) NOT NULL,
  `ItemId` int(11) NOT NULL,
  KEY `CategoryId` (`CategoryId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `ItemCategories` (`CategoryId`, `ItemId`) VALUES
(4, 3442),
(5, 3441),
(5, 3456),
(9, 5343),
(10, 5423);

1 个答案:

答案 0 :(得分:1)

请参阅Mike Hillyer关于此主题的经典文章Managing Hierarchical Data in MySQL

中标题为嵌套集合中的聚合函数的小节
相关问题