如何在单个查询中获取父类别

时间:2016-02-28 22:41:23

标签: mysql sql

我是"类别"我的mysql数据库上有三列的表:category_id,parent_category_id,category_name。 category_id是PK和自动增量,parent_category_id包含类别的父级" categori_id"。所以我可以只在一个表中关联类别。

例如:

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 个答案:

答案 0 :(得分:-1)

只需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;