2011-12-15 42 views
1

我有一個表格,有3列id,name and parent_id表示類別。根類別(沒有父母的類別)具有parent_id 0.所有其他類別都具有parent_id作爲其直接父級的標識。對類別的深度沒有限制,我的意思是一個類別可以從根類別下降3,4甚至10個級別。我現在需要的是一個PHP多維數組,它包含第一級的所有根類別,然後包含其下一級的直接子類別,其父類別下的每個子類別及其下的子類別1降級。所以它的一個tree like structure.可以在樹上有很多級別在php中查詢分層mysql表

我不需要確切的代碼,但需要一個想法。一個這樣的想法是通過選擇查詢獲取所有根類別,然後針對每個根查詢啓動選擇查詢以獲得其子類別等等,但是這會是太多的選擇查詢。

或者如果我知道,我的表將包含發言權最大300行,我怎麼能這樣做

$categories=GetResultAsArray(select * from categories); 

,現在在內存中操作$類別陣列以獲得所需的樹。

+0

我認爲你的想法都很好,並且都受到你擁有的數據行數量的限制。性能考慮多少?考慮緩存結果樹?你也可以通過對每個查詢進行一次自加入來減少sql查詢的數量 - 也就是說,讓所有父母和他們的孩子深入一個級別。 – Aerik 2011-12-15 17:47:36

+0

你需要每次都得到完整的樹嗎? – andho 2011-12-16 14:50:47

回答

3

你說得對,使用帶有「parentid」列的解決方案很簡單,但它可以讓你編寫遞歸查詢。還有其他幾種設計用於在數據庫中存儲分層數據,以便更高效地執行查詢。

參見:

0

這是可能的重複(http://stackoverflow.com/questions/8431463/more-efficient-hierarchy-system/8431551),但這裏是查詢相鄰樹(parent_id,id,標題)的片段:

$q = mysql_query("SELECT id, parent_id, name FROM categories"); 
while ($r = mysql_fetch_row($q)) { 
    $names[$r[0]] = $r[2]; 
    $children[$r[0]][] = $r[1]; 
} 

function render_select($root=0, $level=-1) { 
    global $names, $children; 
    if ($root != 0) 
    echo '<option>' . strrep(' ', $level) . $names[$root] . '</option>'; 
    foreach ($children[$root] as $child) 
    render_select($child, $level+1); 
} 

echo '<select>'; 
render_select(); 
echo '</select>';