一般的な意味は、a は b の親、b は c の親など、採点は無期限に延期されるということです。
各メンバーには対応する値があり、この値は 1 ~ 30 の乱数です。
現在、メンバーをランダムに選択するときに、このメンバーと合計値が 200 を超えるすべての親メンバーの合計値を持つメンバーを計算する必要があります。
たとえば、f の次のメンバーが g で、f が g の親であり、g の値が 190 である場合、最終的な計算結果は次のようになります。 d の親レベルでは、g と g のすべての親の値が 203 に達し、200 を超えます。すると、メンバー d が私が望む最終結果になります。
//类里面的递归函数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 より小さい場合、処理が簡単です
pid desc で順序付けます
その後ループフェッチし、
奇妙な 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 をあなたの選択に変更しますメンバー、30 境界 (200) に変更します
where @a<@s
pid desc, id で並べ替えます
) y
where Final!='-'
limit 1
もちろん、実際には php では次のようになります。ここで計算する方が簡単です。
この条件が満たされない場合。 。 。 。繰り返しクエリすることしかできないようです。 。 。 。 。 。