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

Mysql 计算嵌套树下项目的最有效方法,mysql,performance,tree,Mysql,Performance,Tree,因此,我希望在我的网站上提供类别(x)风格的产品数量 我目前正在使用MySQL 我的类别表如下所示: 类别(Id、TreeLeft、TreeRight、Level、Name)-其中“Level”为节点深度 输入的类别如下所示: 我的项目>类别关系表如下所示: itemcegories(ItemId,CategoryId) 假设我有: “管”下有1项 “LCD”下有2项 “闪存”下有1项 “双向无线电”下有1项 如何最有效地查询我的项目(大数据库)+类别(4000数据库),以生成: Elec

因此,我希望在我的网站上提供
类别(x)
风格的产品数量

我目前正在使用MySQL

我的类别表如下所示:
类别(Id、TreeLeft、TreeRight、Level、Name)
-其中“Level”为节点深度

输入的类别如下所示:

我的项目>类别关系表如下所示:
itemcegories(ItemId,CategoryId)

假设我有:

  • “管”下有1项
  • “LCD”下有2项
  • “闪存”下有1项
  • “双向无线电”下有1项
如何最有效地查询我的项目(大数据库)+类别(4000数据库),以生成:

Electronics (5) - Televisions (3) - Tube (1) - LCD (2) - Portable Electronics (2) - MP3 Players (1) - Flash (1) - 2 Way Radios (1) 电子(5) -电视(3) -管道(1) -液晶显示器(2) -便携式电子设备(2) -MP3播放器(1) -闪光灯(1) -双向无线电(1) 请注意,只返回那些包含产品的类别,并正确地将它们统计到树上

非常感谢您的帮助

编辑:DB代码以在本地重新创建环境:

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); 如果不存在“类别”,则创建表( `Id`int(11)非空自动增量, `TreeLeft`mediumint(7)不为空, `TreeRight`mediumint(7)不为空, `级别'tinyint(3)不为空, `Name`varchar(255)不为空, 唯一键'Id'('Id'), 键'TreeLeft'('TreeLeft`) )ENGINE=MyISAM默认字符集=latin1自动增量=11; 在“Categories”(`Id`、`TreeLeft`、`TreeRight`、`Level`、`Name`)值中插入 (1,1,20,1,'电子'), (2,2,9,2,“电视”), (3、10、19、2,“便携式电子设备”), (4,3,4,3,'管'), (5,5,6,3,'LCD'), (6,7,8,3,'等离子体'), (7、11、14、3,“MP3播放器”), (8、15、16、3,“CD播放器”), (9、11、14、3、“双向无线电”), (10、12、13、4,“闪光”); 如果不存在“ItemCategories”,则创建表( `CategoryId`int(11)不为空, `ItemId`int(11)不为空, 键'CategoryId'('CategoryId`) )ENGINE=MyISAM默认字符集=1; 插入到'ItemCategories'('CategoryId','ItemId')值中 (4, 3442), (5, 3441), (5, 3456), (9, 5343), (10, 5423);
请参阅Mike Hillyer在

上关于此主题的经典文章中题为“嵌套集中的聚合函数”的小节,通常树必须用编程语言完成。。。因为它更容易获得每个菜单级别和计数。或者使用一些递归函数。实际产品是否保存在单独的表中?无论哪种方式考虑提供一个样本数据集。老实说,我真的不理解这个问题。Mike Hillyer关于嵌套集的文章(从该图像的来源)确切地告诉您如何获取所有叶节点。从这里开始,找到每一个下面列出的所有产品都是微不足道的,对吗?@Justin-我不知道你在这里想说什么?@anderecrest,这正是Mike文章中“嵌套集中的聚合函数”下的第一个查询所做的!?!