2016-02-28 45 views
0

我在我的mysql數據庫有一個「Categories」表,它有三列:category_id,parent_category_id,category_name。 category_id是PK和自動增量,parent_category_id保存類別的父級「categori_id」。所以我可以在一個表中將類別關聯起來。如何在單個查詢中獲取父類別? - MySql

例如:

category_id parent_category_id category_name 
1    0     USA 
2    1     California 
3    2     San Francisco 
4    0     Canada 
5    4     Alberta 
6    5     Calgary 

我想在一個單一的查詢的類別及其所有的父母。該查詢應該給我像一個結果:

USA > California > San Francisco 

Canada > Alberta > Calgary 

Opencart的實際上做這樣的事情,但它在不同的表類型之間的關係存儲數據。我想在一張桌子上做這個,我不知道該怎麼辦。

+1

你知道孩子的父關係的最大數量?如果是這樣,你可以多次自我加入表格。如果沒有,你需要使用'動態sql'。 – sgeddes

+0

@sgeddes不,我不知道。 – amone

回答

-1

這可以通過只有一個簡單的查詢(SELECT * FROM categories)和一個遞歸函數來解決。

與我袒護。運行PHP代碼自己,檢查,確認結果。

PhpFiddle

//To begin set a category_id, say our node is San Fransisco, so $category_id=3 

//get San Fransisco's id 
$node = 3 

/* Get your database into array structure like this 
$categories = array(
'1'=>array('parent'=>'0', 'name'=>'USA'), 
'2'=>array('parent'=>'1', 'name'=>'California') 
.. 
) 
*/ 

$categories = array(); //or [] as of PHP 5.6 
$qr = mysql_query('SELECT * FROM categories'); 
while($row=mysql_fetch_assoc($qr)) 
{ 
    $categories[$row['category_id']] = array('parent'=>$row['parent_category_id'], 'name'=>$row['category_name']); 
} 


//first element of tree, is San Fransisco, category_id=3 
$tree=array($node); 

function getCategoryTree($node, & $tree){ 
    global $categories; 
    if($categories[$node]['parent']==='0') 
    return; 

    $parent_id = $categories[$node]['parent']; 
    $tree[]=$parent_id; 

    return getCategoryTree($parent_id, $tree); 

} 

//do magick 
getCategoryTree($node, $tree); 

//now you have $tree=array(3,2,1); 
$out=''; 
while($last = array_pop($tree)) 
{ 
    $out.= $categories[$last]['name'].' > '; 
} 

//outputs USA > California > San Francisco 
echo $out; 
+0

讓我們都保持我們的衣服 – Strawberry

相關問題