4

我尝试过使用嵌套集,但在处理多棵树和许多其他复杂情况时,它们变得非常难以维护。我想在这方面给 PHP 的 SPL 库一个尝试(顺便说一句,我们是 PHP 5.3,MySQL 5.1 )。

给定两个数据集:

团体:

+-------+--------+---------------------+---------------+
| id    | parent | Category Name       | child_key     |
+-------+--------+---------------------+---------------+
| 11133 |   7707 | Really Cool Products| 47054         |
|  7709 |   7708 | 24" Monitors        | 57910         |
|  7713 |   7710 | Hot Tubs            | 35585         |
|  7716 |   7710 | Hot Dogs            | 00395         |
| 11133 |   7707 | Really Cool Products| 66647         |
|  7715 |   7710 | Suction Cups        | 08396         |
+-------+--------+---------------------+---------------+

这几项

+------------+------------+-----------+----------+---------+
| child_key  | totalprice | totalcost | totalqty | onorder | (jan, feb, mar..)
+------------+------------+-----------+----------+---------+
| 24171      |      10.50 |     20.10 |      200 |     100 |
| 35685      |      10.50 |     20.10 |      200 |     100 |
| 76505      |      10.50 |     20.10 |      200 |     100 |
| 04365      |      10.50 |     20.10 |      200 |     100 |
| 01975      |      10.50 |     20.10 |      200 |     100 |
| 12150      |      10.50 |     20.10 |      200 |     100 |
| 40060      |      10.50 |     20.10 |      200 |     100 |
| 08396      |      10.50 |     20.10 |      200 |     100 |
+------------+------------+-----------+----------+---------+

这些数字实际上比这复杂得多(我实际上是在过去 15 年中汇总可变数量的月或年,因此可能需要 20 列汇总结果)。

编辑: @Gordon 我想有很多方法可以获取结果集。理想情况下,我希望 RecursiveIterator 的东西给我一些东西,我可以把它吐到一个包含所有业务逻辑的视图中(聚合叶节点等)已经完成..所以结果看起来像这样(注意邻接列表中的深度是任意的):

+------------+------------+-----------+----------+---------+
| Name       | totalprice | totalcost | totalqty | onorder | (jan, feb, mar..)
+------------+------------+-----------+----------+---------+
| Monitors   |      36.00 |     60.40 |      800 |     400 | (category)
| --24"      |      22.00 |     40.20 |      400 |     200 | (category)
| ---04365   |      10.50 |     20.10 |      200 |     100 | (item)
| ---04366   |      11.50 |     20.10 |      200 |     100 | (item)
| --22"      |      1.50  |     10.10 |      200 |     100 | (category)
| ---04365   |      1.50  |     10.10 |      200 |     100 | (item)
| -01234     |      12.50 |     10.10 |      200 |     100 | (item)
+------------+------------+-----------+----------+---------+

:结束编辑

我一直在试图弄清楚RecursiveIteratorIteratorAggregate,但是我很难找到足够通用的真实世界示例,以真正让我的头脑围绕这些类。

有人可以给我一个先机吗?

编辑:

这里不需要一个非常详细的解决方案。似乎不清楚我可以在哪里(如果有的话)利用 Iterator、RecursiveIterator、RecursiveIteratorIterator 等来提出一个干净、可扩展的解决方案来聚合分层数据。

:结束编辑

4

1 回答 1

0

你真正想要什么:更好、更短的 php 代码或更优化、更快速的请求?如果您的情况是后者,您应该真正研究嵌套集,因为它们允许通过单个 SQL 请求完成对树的一般操作(选择所有后代、移动分支等)。

有关实施的具体示例,请尝试 google 的“Zend_Db_NestedSet”提案。它支持“多根”树,因此理论上您可以使用一张表来为不同的数据集合保持通用的层次关系。

于 2010-05-06T19:16:17.640 回答