5

これを達成するための最良の方法は何かを理解しようとしています。ご意見をいただければ幸いです。

私のMYSQLテーブルの一部:

ID , Username , Invited_by
1  , A        , 
2  , B        , 1
3  , C        , 2
4  , D        , 2
5  , E        , 4
6  , F        , 5

したがって、誰が最も多くのユーザーを招待したかを知りたいのですが、トリックの部分は、A が B を招待し、B が C を招待した場合、A が 2 を招待したと数えます。私が達成しようとしているのはこれです。

ID , Username , Invited
1  , A        , 5
2  , B        , 4
3  , C        , 0
4  , D        , 2
5  , E        , 1
6  , F        , 0

説明

  • F は誰も招待しなかった、C も同じ
  • E が F を招待したので、彼は 1 ポイントを獲得しました
  • D が E を招待したので、E が登録した後に F を招待したので、D は 2 ポイントを獲得します
  • BがCとDを招待し、Dが2人を招待したのでBは4点獲得
  • A が B を招待し、彼が 4 を招待したので、A は 5 人になりました

私はそれが複雑であることを知っています。そのため、最適な解決策を見つけようとしています。

ありがとう、

アップデート

したがって、さまざまなアプローチを試した後、思いついた最良のアプローチは次のとおりだと思います。

  • たとえば、ユーザー テーブルに 1 つのフィールドを「total_invites」として追加します。
  • 新しいユーザーはまだ誰かを招待する機会がなかった可能性があるため、最新のユーザーから古いユーザーまで、各ユーザーの招待の数を計算するクエリを作成します。
  • データベースで「cronjobまたは限られた行ごとに」クエリを実行します
  • バランスの取れたテーブルに到達すると、結果を計算する代わりにロジックが変更され、レポートが必要になると、新しい参照ユーザーがサインインするたびに、各アカウントと関連アカウントのカウンターが増加します。

ノート

  • 1 人のユーザーのクエリを作成することさえ複雑に思えます。そのユーザーの招待ツリーの一番下に到達するまで、n 個のクエリを実行する必要があると思います。
  • テーブルがバランス状態に達すると、ロジックがはるかに簡単になると思います。

参考になる意見や参考資料があれば、よろしくお願いします。

4

1 に答える 1