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 或每次有限的行”上运行查询
  • 一旦我到达平衡表,逻辑就会改变,而不是计算结果一旦我需要报告,每当新推荐的用户登录时,我将增加每个帐户和相关帐户的计数器。

笔记

  • 即使为单个用户构建查询似乎也很复杂,我认为我必须进行 n 次查询,直到到达该用户的邀请树底部
  • 我想一旦桌子达到平衡状态,逻辑就会变得容易得多。

如果您有任何想法或参考可以帮助我,我将不胜感激。

4

1 回答 1

2

我不知道这是否是您要找的,但是如果有很多左连接,它会有点长。

 select t1.ID , t1.Username , count(t2.ID) + count(t3.ID) +  count(t4.ID)  as Invited 
 from table1 t1
 left join table1 t2 On t1.ID = t2.Invited_by
 left join table1 t3 On t2.ID = t3.Invited_by
 left join table1 t4 On t3.ID = t4.Invited_by
 group by t1.ID

在这里演示

输出:

 ID     USERNAME    INVITED
  1       A            5
  2       B            4
  3       C            0
  4       D            2
  5       E            1
  6       F            0

如果您非常关心朋友列表,请检查此函数程序以循环抛出它们。获取递归父列表

编辑2:

对我的想法来说是一个很好的方法,当然,如果你想这样做,这取决于你。

不是插入以前邀请的人的 ID,您可以连接所有以前的人邀请。像那样

    (1, 'A', NULL),
    (2, 'B', 'A'),
    (3, 'C', 'A,B'),
    (4, 'D', 'A,B'),
    (5, 'E', 'A,B,D'),
    (6, 'F', 'A,B,D,E')

每次插入受邀人员时,请使用新邀请的人员将先前的值连接起来。你已经循环了它们。而且您不需要使用很多查询,只需一个。

看看这个DEMO

于 2013-07-29T11:36:31.983 回答