Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL查询以排列类别列表层次结构_Php_Mysql_Hierarchy - Fatal编程技术网

Php MYSQL查询以排列类别列表层次结构

Php MYSQL查询以排列类别列表层次结构,php,mysql,hierarchy,Php,Mysql,Hierarchy,我有一个数据库列表,如下所示: ID Name Parent_ID 1 Cat 1 NULL 2 Cat 2 NULL 3 Cat 3 2 4 Cat 4 3 5 Cat 5 1 6 Cat 6 2 我想得到的结果是,所有的类别都是按等级顺序排列的,并且是按字母顺序排列的。像这样: Cat 1 Cat 5 Cat 2 Cat 3

我有一个数据库列表,如下所示:

ID      Name      Parent_ID
1       Cat 1     NULL
2       Cat 2     NULL
3       Cat 3     2
4       Cat 4     3
5       Cat 5     1
6       Cat 6     2
我想得到的结果是,所有的类别都是按等级顺序排列的,并且是按字母顺序排列的。像这样:

Cat 1
    Cat 5
Cat 2
    Cat 3
        Cat 4
    Cat 6
我真的不确定如何获得这样的结果,这是我目前所拥有的,但不起作用:

 SELECT * from Categories AS parent 
 LEFT JOIN Categories AS child ON child.Parent_ID = parent.ID

非常感谢您的帮助。

我认为,您需要用PHP构建类别树。尝试一下(示例):

$sql='SELECT*from Categories ORDER BY parent_id ASC';
$items=//获取为assoc.array的数组
//范例
//$items=数组(
//数组('id'=>3,'parent_id'=>1,'name'=>'..),
//数组('id'=>4,'parent_id'=>3,'name'=>'..),
//数组('id'=>7,'parent_id'=>0,'name'=>'..),
//);
$childs=array();
foreach($items as&$item)$childs[$item['parent_id']][]=&$item;
未结算(项目);
foreach($items as&$item)if(isset($childs[$item['id']]))
$item['childs']=$childs[$item['id']];
未结算(项目);
$tree=$childs[0];
回声';
打印(树);
回声';

可能重复@HAL9000 No。只有两个级别如果您知道您的树只有两个级别,只需根据需要将表连接到自身即可。感谢您的回复。在这个例子中,只有几个级别,但是它可以更深入。我认为在这种情况下使用递归更好。获取根目录,然后递归地获取父目录和这些父目录的父目录,直到得到“nothing”,然后处理到另一个根目录directory@ASTRALiENS这是一个解决方案:)感谢您提供这些解决方案。我想问题是,哪一个会产生最快的结果。我假设一个MYSQL查询和处理过的PHP是最快的,而不是多个SQL查询。我会试试这个,但非常感谢!
$sql = 'SELECT * from Categories ORDER BY parent_id ASC'; 
$items = // fetch as array of assoc.arrays

// example
// $items = array(
//     array('id' => 3, 'parent_id' => 1 ,'name'=>'..'),
//     array('id' => 4, 'parent_id' => 3, ,'name'=>'..'),
//     array('id' => 7,  'parent_id' => 0, ,'name'=>'..'),
//);

$childs = array();
foreach($items as &$item) $childs[$item['parent_id']][] = &$item;
unset($item);

foreach($items as &$item) if (isset($childs[$item['id']]))
    $item['childs'] = $childs[$item['id']];
unset($item);

$tree = $childs[0];

echo '<pre>';
print_r($tree);
echo '</pre>';