【问题标题】:MYSQL query to arrange list of categories hierarchyMYSQL 查询以排列类别层次结构列表
【发布时间】:2015-05-13 03:26:54
【问题描述】:

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

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

感谢任何帮助。

【问题讨论】:

  • @HAL9000 没有。只有2个级别
  • 如果您知道您的树只有几个级别,只需尽可能频繁地将表外部连接到自身。
  • 感谢您的回复。在这种情况下,只有几个级别,但它可以更深。

标签: php mysql hierarchy


【解决方案1】:

我认为,您需要在 PHP 中构建类别树。试试看(示例):

$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>';

【讨论】:

  • 我认为在这种情况下最好使用递归。获取根目录,而不是递归地获取父猫和那些父的父,直到你得到“无”,而不是处理到另一个根目录
  • @ASTRALiENS 它的解决方案之一 :)
  • 感谢您提供这些解决方案。我想问题是哪个会产生最快的结果。我会假设单个 MYSQL 查询和处理的 PHP 将是最快的,而不是多个 SQL 查询。我会试试这个,但非常感谢!
猜你喜欢
  • 2011-05-26
  • 2016-01-06
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
相关资源
最近更新 更多