好的,谢谢
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
,我发现这个算法可以做我想要的:
function where($root)
{
$num = $root->getNumberOfDescendants();
if ( $num < 2 )
return $root;
$finder = DbFinder::from('User')->
where('LeftId','>=',$root->getLeftId())->
where('RightId','<=',$root->getRightId())->
whereCustom('user.RightId = user.LeftId + ?',1,'left')->
whereCustom('user.RightId = user.LeftId + ?',3,'right')->
combine(array('left','right'),'or')->
orderBy('ParentId');
return $finder->findOne();
}
它基本上执行这个SQL:
SELECT u.*
FROM user u
WHERE u.LEFT_ID >= $left AND u.RIGHT_ID <= $right AND
(u.RIGHT_ID = u.LEFT_ID+1 OR u.RIGHT_ID = u.LEFT_ID+3)
ORDER BY u.PARENT_ID
LIMIT 1
一个叶子有right=left+1,一个有1个子节点有right=left+3。通过添加order by u.parent_id,我们可以找到树中可用的最高节点。如果你使用左\u id或右\u id,它不会平衡树。