2010-04-16 29 views
4
從鄰接表結果

我使用嵌套組嘗試過了,他們變得非常困難多樹和許多其他併發症的處理時保持..我想給PHP的SPL圖書館刺了這個(順便說一下,我們是PHP 5.3,MySQL 5.1)。如何聚合使用PHP的SPL

給出兩個數據集:

的羣組:

+-------+--------+---------------------+---------------+ 
| 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) 
| -|  12.50 |  10.10 |  200 |  100 | (item) 
+------------+------------+-----------+----------+---------+ 

:編輯完

我一直在想圖o ut RecursiveIteratorIteratorAggregate,但我很難找到真實世界的示例,這些示例足夠通用,可以真正包裹這些類。

有人可以給我一個良好的開端?

編輯:這裏不需要

一個非常詳細的解決方案。它只是似乎不清楚在哪裏(如果有的話)我可能會使用迭代器,RecursiveIterator,RecursiveIteratorIterator等拿出一個乾淨,可擴展的解決方案來聚合分層數據。

:編輯完

+0

*(相關)* http://www.phpro.org/tutorials/Introduction-to-SPL.html – Gordon 2010-04-16 14:43:40

+0

*(建議)*您可能要添加一個例子的ResultSet的clearity。 – Gordon 2010-04-16 14:45:59

+1

@戈登感謝您的迴應,我添加了一個理想的結果集。 – 2010-04-16 15:21:47

回答

0

你到底想:更好和更短的PHP代碼或更優化和快速的請求?如果你的情況是後者,你應該真正查看嵌套集,因爲它們允許在一棵樹上進行一般操作(選擇所有後代,移動分支等)由一個SQL請求完成。

對於實施的具體實例嘗試谷歌的「Zend_Db_NestedSet」的提案。它支持「多根」樹,因此理論上可以使用一個表來爲不同的數據集保留通用的層次關係。

+0

是的,但不幸的是Zend_Db_NestedSet不存在 - 它只是一個建議,哈哈。我實際上現在正在使用一個鄰接表和嵌套集的組合,而問題在於可維護性。老實說,性能不是問題 - 對於我的特殊情況,有太多的事情可以去(並且已經消失)嵌套集合。學說有一個優秀的嵌套集處理程序..不幸的是,目前這不是一個選項。 – 2010-05-07 12:17:53

+0

我在尋找的是可維護的php代碼和很少的(非遞歸)數據庫請求..我想檢索整個樹一次,然後儘可能優雅地將其構建到一個數組中。 – 2010-05-07 12:19:51