我有一個通用的數據庫結構,它使用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的?
謝謝!
我有一個通用的數據庫結構,它使用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的?
謝謝!
您是否有一個天真的實現?你在尋找最好的方法嗎?樹是遞歸的,所以我認爲你會像樹高一樣查詢數據庫。
這個僞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可能永遠循環
這就是我所說的「醜陋」 –
這是一個天真的方式來解決他的表的問題。向架構添加高度更好,我認爲。你知道在不改變模式的情況下解決問題的更好方法嗎?通常,樹木也會受到繃帶,如果桌子很大,這並不重要。 – llazzaro
當然,我知道。不要遇到存在這樣的問題的情況。 –
獲得深度的更好方法是將其與數據一起存儲在單獨的字段中。
更好的方法是使用更加智能的方式來存儲分層數據,例如嵌套集或物化路徑。
雖然您可以從當前的表格設置中獲得深度,但當然,這將是最醜陋的方式,遞歸。 但是,如果您的表格相對較小,但不會有什麼大不了的
不確定你的意思是「深度」?你想獲得Parent_id還是隻是巧合的相同的價值? –