【发布时间】:2013-04-22 00:19:52
【问题描述】:
所以我希望在我的网站上提供category (x) 风格的产品计数。
我目前正在使用 MySQL。
我的类别表如下所示:
Categories (Id, TreeLeft, TreeRight, Level, Name) - 'Level' 是节点深度。
输入的类别如下所示:
我的项目 > 类别关系表如下所示:
ItemCategories (ItemId, CategoryId)
假设我有:
- “TUBE”下有 1 项
- “LCD”下有 2 项
- “FLASH”下有 1 项
- “2 WAY-RADIO”下的 1 项
我怎样才能最有效地查询我的项目(大 db)+ 类别(4000 in db),以产生:
电子产品 (5) - 电视 (3) - 管 (1) - 液晶显示器 (2) - 便携式电子产品 (2) - MP3 播放器 (1) - 闪光 (1) - 2 路收音机 (1)注意只返回那些包含产品的类别,并正确地在树上计数。
非常感谢任何帮助。
编辑:在本地重新创建环境的数据库代码:
如果不存在“类别”,则创建表( `Id` int(11) NOT NULL auto_increment, `TreeLeft` mediumint(7) NOT NULL, `TreeRight` mediumint(7) NOT NULL, `Level` tinyint(3) NOT NULL, `名称` varchar(255) NOT NULL, 唯一键`Id`(`Id`), KEY `TreeLeft` (`TreeLeft`) ) 引擎=MyISAM 默认字符集=latin1 AUTO_INCREMENT=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, '2 Way Radios'), (10、12、13、4,“闪光”); 如果不存在`ItemCategories`,则创建表( `CategoryId` int(11) NOT NULL, `ItemId` int(11) 非空, KEY `CategoryId` (`CategoryId`) ) 引擎=MyISAM 默认字符集=latin1; 插入`ItemCategories`(`CategoryId`,`ItemId`)值 (4, 3442), (5, 3441), (5, 3456), (9, 5343), (10, 5423);【问题讨论】:
-
通常树必须用编程语言来完成...因为获取每个菜单级别和计数要容易得多。或者使用一些递归函数。
-
实际产品是否保存在单独的表中?无论哪种方式,都可以考虑提供一个样本数据集。
-
说实话,我不太明白这个问题。 Mike Hillyer 关于嵌套集的文章(来自此图像的来源)告诉您如何获取所有叶节点。从那里,找到每个列出的所有产品都是微不足道的,对吧?
-
@Justin - 我不知道你在这里想说什么?
-
@AndreeCrist,这正是 Mike 文章中“嵌套集中的聚合函数”下的第一个查询所做的!?!
标签: mysql performance tree