論理演算アルゴリズムの考え方について質問する

WBOY
リリース: 2016-06-23 13:51:26
オリジナル
804 人が閲覧しました



一般的な意味は、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 では次のようになります。ここで計算する方が簡単です。


この条件が満たされない場合。 。 。 。繰り返しクエリすることしかできないようです。 。 。 。 。 。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート