递归吧 //类里面的递归函数 function test($id,$num=0,$max=200){ $sql="SELECT * FROM {{test}} WHERE id=$id"; $res=Yii::app()->db->createCommand($sql)->queryRow(); $num+=$res['value']; if($num<$max){ $name=self::test($res['pid'],$num); }else{ $name=$res['name']; } return $name; }//调用 $tr=new classtest(); echo $tr->test(7); //结果 d
如果你的pid都比id小的话比较好办 order by pid desc 然后循环fetch即可, 给个奇葩的sql,(符合上面条件的情况下) select * from ( select id, pid, `value`, if(id=@p, concat(@p:=pid,'|',@a := @a+`value`), ''), if(@a>@s, id, '-') as Final, @a from test, (select @a:=0, @p:=6, @s:=30) x -- 其中6改成你所选择的成员的id, 30 改成你的界(200) where @a<@s order by pid desc, id ) y where Final!='-' limit 1 ; 当然实际上在php里计算比较方便。 如果不满足这个条件的话。好像只能反复查询了
//类里面的递归函数
function test($id,$num=0,$max=200){
$sql="SELECT * FROM {{test}} WHERE id=$id";
$res=Yii::app()->db->createCommand($sql)->queryRow();
$num+=$res['value'];
if($num<$max){
$name=self::test($res['pid'],$num);
}else{
$name=$res['name'];
}
return $name;
}//调用
$tr=new classtest();
echo $tr->test(7);
//结果 d
order by pid desc
然后循环fetch即可, 给个奇葩的sql,(符合上面条件的情况下)
select * from (
select id, pid, `value`,
if(id=@p, concat(@p:=pid,'|',@a := @a+`value`), ''), if(@a>@s, id, '-') as Final, @a
from test, (select @a:=0, @p:=6, @s:=30) x -- 其中6改成你所选择的成员的id, 30 改成你的界(200)
where @a<@s
order by pid desc, id
) y
where Final!='-'
limit 1
;
当然实际上在php里计算比较方便。
如果不满足这个条件的话。好像只能反复查询了