如何从同一个表中的父行获取所有子项?

时间:2011-01-14 21:37:30

标签: sql mysql

9 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

答案 2 :(得分:0)

AFAIK是不可能的。除非你写一些存储过程来完成这项工作。

答案 3 :(得分:0)

答案 4 :(得分:0)

在MySQL中,您可以创建存储过程,它将返回您所需的内容。您可以查看MSSQL http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm的简单示例。但是对于MySQL来说也很容易做到

答案 5 :(得分:0)

问题在于,Id不会根据您遍历树的顺序进行存储。如果您通过构建树来修复此问题,然后将所有节点复制回另一个表,根据遍历节点的顺序分配Id - 下次您只需扫描前向结果就可以填充树选择语句如

SELECT * FROM my_table ORDER BY Id。

如果树经常更改,则此解决方案将无法工作,因为必须重新生成表。这可以通过将Id最初增加大数(例如1000)来解决,这样每​​次都不需要重新编号,因为您可以从间隙中分配新节点Id。如果树的高度很小,则使用分数作为键也可以很好地工作。

答案 6 :(得分:0)

最简单的方法就是在PHP中完成它。我不得不在Symfony做类似的事情,但它应该易于阅读和适应。从表行开始使用数组。

  public function executeGetTree(sfWebRequest $request)
  {
    $rows = Doctrine_Core::getTable('TreeNode')->findAll();
    $treeNodes = $rows->toArray();

    //set up new array to store children for each parent node
    $nodesContainer = array();
    foreach ($treeNodes as $node){
        $parentId = $node['parent_id'];
        //if node has no parent, it is a root node
        $nodesContainer[isset($parentId)? $parentId : 'root'][] = $node;
    }

    $tree = array();
    //recursively get descendents for each root node
    foreach($nodesContainer['root'] as $rootNode)
    {
      $tree[] = $this->getChildren($nodesContainer, array($rootNode));
    }

    print_r($tree);

    return sfView::NONE;
  }

  private function getChildren(&$container, $parentNode){
      $children = array();
      foreach ($parentNode as $node){
          if(isset($container[$node['id']])){
            $node['children'] = $this->getChildren($container, $container[$node['id']]);
          }
          $children[] = $node;
      } 
      return $children;
  }  

答案 7 :(得分:0)

  

我希望这可以通过某种奇特的db加入或类似的东西来完成。

你应该考虑听起来多么不可能。 只考虑树中的一个分支,从1 - >; 4 - > 9& 10 您如何在MySql结果或任何DBMS的单行中可视化关系。

我能想到的分层结果唯一明智的选择是XML,但是你不想去那里,因为它可以在基础record.parent结构上用PHP做得更好,而不是解析XML。

答案 8 :(得分:0)

也许是这样的,适当添加级别:

SELECT 
    d1.*, 
    d2.`name` AS '2nd Level', 
    d3.`name` AS 'Top Level'
    FROM `my_table` AS d1 
    LEFT JOIN `my_table` AS d2 ON d1.parent_id=d2.id 
    LEFT JOIN `my_table` AS d3 ON d2.parent_id=d3.id