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