簡體   English   中英

PHP中的MPTT(修改的預排序樹遍歷)問題

[英]MPTT ( Modified Preorder Tree Traversal) issue in PHP

我的第一篇文章在這里! 似乎是明智的地方;)

我目前正在進行一些測試,這是我第一次嘗試使用MPTT(修改的預樹遍歷)方法在PHP的幫助下將數據存儲在Mysql數據庫中。

但是,我正在嘗試找出最注重性能的方式,以特定的父級在特定級別獲取所有列表元素。

如果將父母輸入的名稱命名為“ Bilar”,則可以從下圖轉換為Saab和Chrysler類別。 (如果這不是您最強的一面,則用瑞典語表示“汽車”;)

由於我無法發布圖像,因此下面是流程圖的鏈接: http : //www.phpsidan.nu/files/mptt/mptt1.png

目前,我一直在執行兩個查詢以執行我想要的操作,並使用大量代碼來計算級別並吐出同一級別上的所有其他元素。

有沒有更好的方法可以做到這一點,並且希望只使用一個查詢?

非常感謝!

我敢肯定這是可以優化的,但是假設您具有“名稱”,“ lft”和“ rgt”列,以下內容將為您提供“ Bilar”的2級同級對象。

SELECT node.name,                                                                                                                                     
       node.lft AS sort,                                                                                                                                                                                                                                                               
       (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth                                                                        

FROM car AS node,                                                                                                                                  
     car AS parent,                                                                                                                                
             car AS sub_parent,                                                                                                                            
             ( SELECT node.name, (COUNT(parent.name) - 1) AS depth                                                                                          
                 FROM car AS node,                                                                                                                         
                      car AS parent                                                                                                                        
                WHERE node.lft BETWEEN parent.lft AND parent.rgt                                                                                            
                  AND node.name = "Bilar"                                                                                                                       
             GROUP BY node.name                                                                                                                             
             ORDER BY node.lft) AS sub_tree

WHERE node.lft BETWEEN parent.lft AND parent.rgt                                                                                                     
  AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt                                                                                             
  AND sub_parent.name = sub_tree.name

GROUP BY node.name HAVING depth <= 2                                                                                                                 
ORDER BY node.lft

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/具有有關嵌套集的信息和查詢示例

在NS中獲取直系子代非常復雜,因此某些人喜歡將顯式的parent_id連同“ left”和“ right”指針一起存儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM