推荐朋友点查询

时间:2013-07-29 10:57:47

标签: mysql sql

我正在试图找出实现这一目标的最佳方法,我非常感谢任何意见。

我的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所以得到2分
  • B邀请C和D,D然后邀请2个人,所以B得到4分
  • 他邀请了4个受邀B,所以A得到5个人

我知道这很复杂,这就是为什么我要为它找出最佳解决方案。

谢谢,

更新

所以在我尝试了不同的方法后,我相信我想出的最佳方法如下:

  • 将1个字段添加到users表中,例如“total_invites”
  • 构建一个查询,计算每个用户的邀请数量,从最新用户开始直到老用户,因为新用户可能还没有机会邀请任何人。
  • 在数据库“cronjob或每次限制行”上运行查询
  • 一旦我到达平衡表,一旦我需要报告,逻辑将改变而不是计算结果我会在新的推荐用户登录时增加每个帐户和相关帐户的计数器。

备注

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

如果您有任何想法或参考资料可能会有所帮助,我将非常感谢。

1 个答案:

答案 0 :(得分: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

DEMO HERE

输出:

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

如果您关注深度朋友列表,请检查此函数过程以循环抛出它们。 get a recursive parent list

<强> EDIT2:

对于我的想法是一个很好的aproche,当然如果你想做的话,它取决于你。

不是插入之前由人邀请的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')

每当您插入受邀人员时,请使用新的人员邀请将其与之前的值相关联。你已经把它们圈起来了。你不需要使用很多查询,只需要一个。

看看this DEMO