MySQL ve PHP iç içe kümesi kullanılarak kornişle sonuç almak nasıl?

5 Cevap php

Derinliğine bir sınırlama yoktur.

Yapılandırılmış şube hatta tüm ağaç almak nasıl?

Managing Hierarchical Data in MySQL: tanımı buradan bir

5 Cevap

Ben sizin için soruyorsun oldukça ne emin değilim, ama bu tüm ağaç, yol başına bir hattı alabilirsiniz fazlalaştı kullanarak MySQL tamamen şöyle bir dizge olarak her yol GROUP_CONCAT ve http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ adlı örneği "Tek Yol alınıyor" genişletilmesi

SELECT 
  GROUP_CONCAT(parent.name ORDER BY parent.lft ASC SEPARATOR '|') 
FROM nested_category AS node
     CROSS JOIN nested_category AS parent 
WHERE 
  node.lft BETWEEN parent.lft AND parent.rgt 
GROUP by node.id 
ORDER BY node.lft;

Bu irade çıktı ağaçtaki her düğüm için yollar.

nested_category AS node CROSS JOIN nested_category AS parent nested_category AS node, nested_category AS parent eşdeğer olduğuna dikkat edin.

Bu dizeyi belirtir kullanır '|' ayırıcı olarak, size yol öğelerinden ve bir diziye bu patlayabilir istiyorsanız Eğer bunun yerine belirttiğiniz verebilecek veri değil bir dize var biliyorum.

Ben de benzer bir kullanımı, aynı zamanda çocuğun ebeveyn için bir referans tutar oldukça aynı yaklaşım; Bu kolay verilerden bir ağaç yapısı bina yapar. Bu faydalı ise, PHP bir ağaca veri ayıklamak için kod gönderebilir.

@ Marc, açıklanan veri yapısı ayarlamak işlemleri yapmak için ille de değildir; Sadece kolay yapısı ile çalışma yapar. Eğer veri bütün bir ağacı olsun istiyoruz ve her kayıt sadece üst kaydın bir işaretçi saklar, o zaman özyinelemeli veri tam ağacı almak için veritabanını sorgulamak gerekir. Orada açıklanan yaklaşımı kullanırsanız, o zaman bir sorguda tüm set elde edebilirsiniz.

Edit: -> ana referans yanı sıra lft / sağ şeyler burada bir çocuk korumak IF bir ağaç yapısı oluşturur kod. Sadece ağacın tek bir düzeyde doğrudan soyundan almak istiyorsanız yine hızlı aslında bu yolu çünkü, bunu tercih ederim.

Ben şartları göstermek için geri şerit denedim, bu yüzden vb bazı yazım hataları olabilir ama fikir almalısınız. Önemli parçalarıdır

  • "Lft ASC" sorgunuzu sipariş, bu şekilde her zaman çocuklar önce bir ana düğüm işleyecek.
  • Kimliği göre her düğüm için bir başvuru saklamak; bu şekilde bu düğümün herhangi bir alt kolayca bulmak ve ebeveyn kendisini ekleyebilirsiniz.
  • (Yukarıdaki gibi) sonuçları, kimliği tarafından her mağaza referans yoluyla yineleme ve ebeveyn çocuklarına bu düğüm eklemek.

Her neyse, burada kod -

<?php
$children = mysql_query('SELECT * FROM nested_category ORDER BY lft ASC');

/* Get the first child; because the query was ordered by lft ASC, this is
   the "root" of the tree */
$child          = mysql_fetch_object($children);
$root           = new StdClass;
$root->id       = $child->folderID;
$root->children = array();
/* Store a reference to the object by the id, so that children can add
   themselves to it when we come across them */
$objects        = array($root->id => $root);

/* Build a tree structure */
while ($child = mysql_fetch_object($children)) {
    /* Create a new wrapper for the data */
    $obj           = new StdClass;
    $obj->id       = $child->id;
    $obj->children = array();
    /* Append the child to the parent children */
    $parent = $objects[$child->parent];
    $parent->children[] = $obj;
    $objects[$obj->id] = $obj;
}   

Mysql tarafında veri yapısı biraz egzotik olsa bile, veriler hala normal bir sorgu yöntemleri kullanılarak alınır. PHP diziye uygun deyim, sonuçlar üzerinde döngü ve malzeme bunu yayınlayın. Eğer isterdim neden MySQL daha PHP set operasyonları yapmak çok daha zor olurdu ben, bilmiyorum ama.

Ben Sol ile yapacağını linke bakarak Katıldı. Tam Ağacı alınıyor örneğe bakın.

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4 FROM category AS t1 LEFT JOIN category AS t2 ON t2.parent = t1.category_id LEFT JOIN category AS t3 ON t3.parent = t2.category_id LEFT JOIN category AS t4 ON t4.parent = t3.category_id WHERE t1.name = 'ELECTRONICS';

You wold need an LEFT JOIN for every hierarchical level you want to include. The result then can be parsed by php into any desirable data structure. Just ignore NULL results.

| ELECTRONICS | TELEVISIONS | TUBE | NULL |

| ELECTRONICS | TELEVISIONS | LCD | NULL |

| ELECTRONICS | TELEVISIONS | PLASMA | NULL |

| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |

| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS | NULL |

| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL |

Eğer derin bir yapıya sahip olduğunda MySQL birçok tablolar katıldı gerektiğinde yürütmek için uzun bir zamana ihtiyaç Katıldı çünkü bu kötü bir methode olacaktır.

Ben sorunuzu yanlış vermedi umuyoruz.

Ben recursive olmadan .. php kullanarak ağaç yapıları üzerinde çalışmak hangi aracılığıyla yöntemi hakkında sizi bilgilendirmek zorunda. Seni çok standart php kütüphanesinden (SPL) ile bilinir düşünüyorum. Eğer sorunuza yineleyicileri kullanabilirsiniz.

http://www.php.net/~helly/php/ext/spl/

Burada SPL için belgeler için bağlantıdır. Burada Mysql bağlantı yukarıdaki örnek için bazı çözümler şunlardır: - basitçe tablodan dizi alınırken ile size prefrence olarak onlara ve ekranda çalışabilirsiniz

Için: - komşuluk Listesi Modeli

Tüm oğul dahil tüm sonuçları gösterecek olan "RecursiveIteratorIterator" kullanabilirsiniz.

If you only want to show the childs. you can use "ParentIterator"