2017-09-27 5 views
1

私は以下のようなMySQLテーブルがあります。下から行くと、「ステータス= 1」のスポンサーを探しています。しかし、私はそれを順序でしたい。例えば、私は "マイク"です。私のスポンサーは "Richard"です。私は "リチャード"のステータスが1であるかどうかチェックしたい。彼はしていない。だから私は "リチャード"のスポンサーをチェックして、彼のステータスが1かどうかを調べるつもりです。彼はどちらもしません。だから、私はスポンサーのスポンサーのスポンサーをチェックしていきます。ユーザーのスポンサーがPHPを無限に上回っていますか?

通常、いくつかのレベルをチェックしたい場合は、1回または複数回のクエリでこれを行うことができます。しかし、問題は、ステータスが1のスポンサーが見つかるまで無限レベルをチェックしたいのですが?その仕事はどうですか?どのようなPHPのクエリ/関数は、無限レベルをチェックするように見えるだろうか?逆の順序で

Sponsors  Referrals  Status 
 
    -------------------------------------- 
 
    Zack   Joey    1 
 
    Joey   Tracy   0 
 
    Tracy  Helen   0 
 
    Helen  Richard   0 
 
    Richard  Mike    0

+1

より良い方法は、その後の子どもたちとの最初の親のスポンサーIDを保存することです。 –

+0

私に例を挙げてもらえますか?それは私が視覚化するのに役立ちます。 –

+0

Zackが作成されました - > ZackはJoeyを参照します - > JoeyはZackへのリンクを持ち、parent'id'と呼んでいます。JoeyはTracyを参照し、JoeyはJoeysにTracysの 'parent_id'を設定します。 Zackの連鎖の中には同じ 'parent_id'があります。このようにして、サブ選択などなしで 'parent_id'を参照することができます –

答えて

0

:しかし、から選択するライブラリのカップルがあるように思われますあなたが既に配列の中の人々のリストを持っていたと仮定してPHPの解決策を与えてください(つまり、実際に無駄になるかもしれないので、ペアごとに1つのクエリはありません)。

ステータス1のスポンサーに当たるまで、スポンサーからスポンサーに行くということは、繰り返し実行する必要があります。この機能を見てみましょう:

<?php 
$people = [ 
    [ 
     "sponsor" => "Zack", 
     "referal" => "Joey", 
     "status" => 1, 
    ], 
    [ 
     "sponsor" => "Joey", 
     "referal" => "Tracy", 
     "status" => 0, 
    ], 
    [ 
     "sponsor" => "Tracy", 
     "referal" => "Helen", 
     "status" => 0, 
    ], 
    [ 
     "sponsor" => "Helen", 
     "referal" => "Richard", 
     "status" => 0, 
    ], 
    [ 
     "sponsor" => "Felipe", 
     "referal" => "Juan", 
     "status" => 0, 
    ], 
    [ 
     "sponsor" => "Richard", 
     "referal" => "Mike", 
     "status" => 0, 
    ], 
]; 
static $i = 0; 
function getParentSponsor($referal, $people) { 
    foreach ($people as $pair) { 
     if ($pair["referal"] === $referal) { 
      if ($pair["status"] === 1) { // we found our parent sponsor 
       return $pair["sponsor"]; 
      } 
      else { 
       return getParentSponsor($pair["sponsor"], $people); // we need to go to the next element 
      } 
      return $pair["sponsor"]; 
     } 
    } 
    $i++; 
} 
echo getParentSponsor("Mike", array_reverse($people)).PHP_EOL; // Zack 
echo getParentSponsor("Richard", array_reverse($people)).PHP_EOL; // Zack 
echo getParentSponsor("Joey", array_reverse($people)).PHP_EOL; // Zack 

Demo

+0

ああ。これはまさに私が探していたものかもしれません。私は実際のコードでいくつかのテストを行い、それがどのように動作するかを見ていきます。 –

+0

それは素晴らしいです!しかし、もし可能であればローレンス・シェロンのアプローチに従うことを強くお勧めします。 – ishegg

0

あなたはステータス1を持つすべてのスポンサーをしたい私の理解あたりとして

​​

これを試してみてください。

+0

いいえ、OPは、リチャード、マイクまたはトレイシーからザックを取得したいと思います。 –

+0

残念ながら、それはそれほど簡単ではありません。スポンサーからスポンサーへの線形パターンに従い、そのステータスが1であるかどうかを調べる必要があります。また、各スポンサーのステータスはいつでも1または0に変更できるため、毎回同じスポンサーではない可能性があります。 –

+0

@themasterそういうわけで、多くのスポンサーがいるかどうかを知るための単一の「ステータス」はありません。最初の親を参照する別の列が必要です。または、ステータスがバイナリであることを忘れて、親の主キーへの参照IDを使用します。 0の場合、その親はありません。 –

0

これは、アプリケーションからデータベースへのN個のリクエスト(Nは要求されたステータスのスポンサーが見つかるまで処理する必要があるレベル)であるため、私の意見では間違ったアプローチです。これを最適化する可能性がありますが、基本的な問題は常に同じです。

データは、基本的にツリー構造(スポンサーが常に1人のみを参照できる場合はリスト)を表します。

ツリーを表現するためのパターンはリレーショナルDBにありますが、db構造を変更する必要があります(Nested setはその一例に過ぎません)。 Bill Karwin has a nice slidedeck on the topic

MySQLに限らず、MySQL 8.0がリリースされるまで待つことができる場合は、CTE/Recursive queriesを使用することもできます。

いずれにしても、ツリー構造が整ったらユースケースに限定されていないことがあります。私は特定の1つのライブラリをお勧めすることはできませんので

Appendum

PHPは選択肢の私のプログラミング言語ではありません。解決策は間違いなくローレンスが示唆するようparent_idを持っているように思わけど、私は思いますけれども、

関連する問題