PHP MPTT (Modifiye Preorder Ağacı Geçişi) sorunu

2 Cevap php

Burada benim ilk yazı! Bu bilge almak için yer gibi görünüyor ;)

Şimdiye PHP yardımı ile benim MySQL veritabanı veri depolama yaklaşımı (Preorder Ağacı Geçişi Modifiye) MPTT denemek için girişim benim ilk bazı test ortasında şu anda duyuyorum.

Ancak, belirli bir ebeveyn ile, belirli bir düzeyde tüm liste öğelerini almak için en performans odaklı bir yol bulmaya çalışıyorum.

Yani girilen ana "Bilar" adlı olsaydın, aşağıdaki görüntüden kategoriler Saab ve Chrysler getting içine çevirmek olabilir. (Hangi İsveççe Otomobil demektir ki, en güçlü tarafı değilse ;))

As i cant post images, here's a link to the flowchart: http://www.phpsidan.nu/files/mptt/mptt1.png

Şu anda ben iki ne istediğinizi yapmak için querys ve düzeyini hesaplamak ve aynı düzeyde tüm diğer öğeleri dışarı tükürmek için kod oldukça bir miktar yapıyor.

Bunu yapmak ve umarım yalnızca bir sorgu kullanarak daha iyi bir yolu var mı?

Thanks a lot!

2 Cevap

Ben ancak sütunları "isim", "lft" ve "rgt" varsayarak, bu optimize edilmiş olabilir emin değilim, şu size "Bilar" düzeyi 2 kardeşler verecektir.

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/ has infos and query examples on nested sets

NS hemen çocuklar oluyor, bu nedenle bazı insanlar "sol" ve "sağ" işaretçileri ile birlikte açık parent_id depolamak için tercih, karmaşıktır.