2016-02-28 49 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

相关问题