【问题标题】:Most efficient way to count items under a nested tree计算嵌套树下项目的最有效方法
【发布时间】: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


【解决方案1】:

请参阅 Mike Hillyer 关于此主题的经典文章的嵌套集中的聚合函数小节,地址为Managing Hierarchical Data in MySQL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多