2011-09-25 34 views
1

我有一個通用的數據庫結構,它使用parent_id作爲層次結構。MySQL和PHP通過parent_id獲取層次結構中項目的深度

我試圖找出項目的深度。

所以就拿這一點:

ID Name Parent_id 
1 Games 0 
2 Nintendo 1 
3 DS 2 
4 3D 3 

如果我想找到ID 4(3D)的深度,答案是3。任何想法,我怎麼會查詢此或SQL的組合和PHP的?

謝謝!

+0

不確定你的意思是「深度」?你想獲得Parent_id還是隻是巧合的相同的價值? –

回答

3

您是否有一個天真的實現?你在尋找最好的方法嗎?樹是遞歸的,所以我認爲你會像樹高一樣查詢數據庫。

這個僞PHP

function getHeigth($item_name) { 
    $res = 0; 
    $current_parent_id = executeSql("SELECT parent_id FROM games g WHERE g.name= ? " , $item_name); 
    while ($current_parent_id != 0) { 
     $current_parent_id = executeSql("SELECT parent_id FROM games g WHERE g.id = ? " , $current_parent_id); 
     $res = $res + 1; 
    } 
    return $res; 
} 

該算法將執行不好,如果你的三個不均衡。

存儲深度會提高性能,但會影響UPDATE和INSERT查詢。

此外,如果你的樹被破壞,這個Psuedo-PHP可能永遠循環

+3

這就是我所說的「醜陋」 –

+0

這是一個天真的方式來解決他的表的問題。向架構添加高度更好,我認爲。你知道在不改變模式的情況下解決問題的更好方法嗎?通常,樹木也會受到繃帶,如果桌子很大,這並不重要。 – llazzaro

+0

當然,我知道。不要遇到存在這樣的問題的情況。 –

1

獲得深度的更好方法是將其與數據一起存儲在單獨的字段中。

更好的方法是使用更加智能的方式來存儲分層數據,例如嵌套集或物化路徑。

雖然您可以從當前的表格設置中獲得深度,但當然,這將是最醜陋的方式,遞歸。 但是,如果您的表格相對較小,但不會有什麼大不了的