2010-12-06 13 views
0

在下面的查詢中有一個名爲main的字段,用於區分這些類別。 因此,常見的類別和主要類別都可以在樹上找到。 main字段只是一種類型,沒有樹結構,我的意思是,它就像一個狀態字段。如何更改爲樹遍歷(嵌套集)創建的CROSS JOIN SQL?

SELECT `c`.*, 
      (count(p.id)-1) AS `depth` 
     FROM `categories` AS `c` 
    CROSS JOIN `categories` AS `p` 
    WHERE (c.lft BETWEEN p.lft AND p.rht) 
     AND (c.root_id =p.root_id) 
     AND (p.main =1) 
    GROUP BY `c`.`id` 
    ORDER BY `c`.`root_id` ASC, `c`.`lft` ASC 

有一個where clausule其指定的父類需要一個主類。此外,有時我需要做一個select其中父類別是一個共同的類別p.main =0

depth是元素在樹中的位置。所以如果一個類別是另一個級別的孩子,深度將是1,如果兩個級別,深度將是2

我的問題是,當我做的選擇上面,如果有孩子打上一棵樹,其中父親(選擇p.main =1)普通類depth總是0主要類別爲普通類。

換句話說,如果我選擇的所有類別的頂級父標記爲main,它會顯示樹的所有類別,包括標記爲main=0的子類別。但是,在這種情況下,深度總是0

查看結果:

alt text

類別142327一個孩子,是不是一個主要類別,但27是,這樣的深度是0 ,但需要是1。類別27664的子項,它們都是主要類別,因此它具有正確的深度。

如何更改此查詢,以便depth字段按預期工作?

參考這裏:How to generate a tree view from this result set based on Tree Traversal Algorithm?

+0

單詞「嵌套集」在這裏會有所幫助。 – ijw 2010-12-06 20:04:56

+0

@ijw changed ... – 2010-12-06 21:02:08

回答

0

事實上,你說你正在尋找這個計數,但僅適用於節點什麼是主父的孩子。如果這就是你真正想要的,那麼你的查詢就比修正它更錯誤 - 你稱之爲'p'並且似乎認爲'父'表的表格實際上是一個'祖先'表 - 同樣'c'不是小孩但'後裔'。您最終會計算main-樹中所有節點的所有標記的祖先。