2016-04-06 10 views
1

Aşağıdaki veritabanı yapısına sahibim ve veritabanım çok büyük olmasa da, belirli bir düğümde veya yaprakta ürünleri görüntülemek için tek bir sorgu yöntemini kullanmak istiyorum. Geçerli veritabanı, diğer çocukları içeren düğümlerin yanı sıra yapraklarla ilgili ürünlere sahiptir (lütfen bkz. Ürün 3 ve 4). Listelemek istediğim, düğümün kök, yaprak veya başka bir çocuk ebeveyni olduğu $ _GET ['node'] tarafından tutulan düğümlere ve çocuklara ait tüm ürünlerdir.İç içe geçmiş tablo ürünleri sorgusu mysql

+---------+-----+-----+---------+ 
| tree_id | lft | rgt | name | 
+---------+-----+-----+---------+ 
|  1 | 1 | 138 | TV's | 
|  2 | 2 | 91 | Phones | 
|  3 | 3 | 26 | Samsung | 
|  4 | 4 | 10 | Used | 
|  5 | 11 | 25 | New  | 
|  6 | 27 | 45 | Apple | 
|  7 | 46 | 90 | Philips | 
|  8 | 47 | 51 | Touch | 
|  9 | 52 | 89 | Key  | 
|   |  |  |   | 
+---------+-----+-----+---------+ 

+------------+-------------+-------+ 
| product_id | Name  | make | 
+------------+-------------+-------+ 
|   1 | Touch Easy | 4466 | 
|   2 | Eagle Eye | 5523 | 
|   3 | Super Phone | 7Utt | 
|   4 | Crazy Touch | Utiir | 
+------------+-------------+-------+ 

+------------+--------+ 
| product_id | cat_id | 
+------------+--------+ 
|   1 |  5 | 
|   2 |  8 | 
|   3 |  2 | 
|   4 |  3 | 
+------------+--------+ 

o kadar çok ben bir düğüm içinde tüm ürünleri almak için ne kadar karmaşık sorgular, aşina değilim (2) 'dir:

$node = SELECT * FROM `categories` WHERE `id` = 2 
    $products = SELECT products_categories.id 
FROM `products_categories`, `categories` 
WHERE `categories`.`left` > ".$node['left']." 
AND `categories`.`right` < ".$node['right']." 
AND `products_categories`.`cat_id` = `categories`.`id` 

    foreach($products as $product){ 

    $prod = new Product($prod['id']) 


    } 

Gördüğünüz gibi olmaz üç yürütme am Sorgular (sınıf içinde biri) ki eminim ki bu en iyi yaklaşım değil.

+1

liste beklenen sonucunuz ve ne denediğiniz –

cevap

0

Bu iç içe geçmiş küme modeli, özellikle veri işleme bölümündeki normal bitişik modelden daha karmaşık ancak seçim için oldukça hızlıdır.

Neyse ki, basit bir Google arama ile, görevlerinizi kolaylıkla gerçekleştirmenize yardımcı olabilecek açık kaynak sınıflarını bulabilirsiniz.

Böyle biri: kullandım https://github.com/riquito/Baobab

arama anahtar kelimeler: github nested set model php mysql

Düzenleme:

özel durum için

bunun gibi bir sorgu işe yarayabilecek:

SET @cid := 2; 
SET @lft := (SELECT `lft` FROM `categories` WHERE `id` = @cid); 
SET @rgt := (SELECT `rgt` FROM `categories` WHERE `id` = @cid); 

SELECT `pc`.`productID` 
    FROM `products_categories` `pc` 
    LEFT JOIN `categories` `c` ON `c`.`id` = `pc`.`categoryID` 
    WHERE `c`.`lft` > @lft 
    AND `c`.`rgt` < @rgt 
;