2013-07-29 39 views
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,那么我会认为这是一种邀请2 ,我想要达到的是这个。

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

说明

  • ˚F邀请任何人,同样对C
  • Ë邀请C以便他拿到1分
  • d邀请Ë所以这意味着后Ë注册,他邀请˚F所以D得到2分
  • B邀请C和D,然后邀请D 2人B得4分
  • 邀请B他邀请4所以A得到5人

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

感谢,

UPDATE

所以之后我尝试了不同的方法,我相信我想出的最好的办法是:

  • 添加1场给用户表为'total_invites'为例
  • 建立一个查询,它将计算每个用户的邀请数,从最新的用户开始,直到老因为新用户可能没有机会邀请任何人。
  • 运行“每一次的cronjob或有限行”
  • 一旦我达到一个均衡表的逻辑会发生变化,而不是计算的结果对数据库的查询,一旦我需要的报告,我会增加每个帐户的计数器以及相关的账户,每当一个新的称为用户登录。

注意

  • 即使建立单个用户的查询看起来很复杂,我想我必须做N次查询,直到我到达底部Ø f该用户的邀请树
  • 我想一旦表达到平衡状态,逻辑将变得更容易。

请如果您有任何想法或参考,可能会帮助我会非常感激。

+0

唯一的办法是通过存储过程或在您的应用程序运行几个查询(取决于最大“朋友深度”)。 – Vatev

+0

如果F邀请G,E也得到一个点? G邀请H,E得到另一个点? – Zelldon

+0

这是一个关于MySQL中递归的问题。因此,这是一个常见问题。 – Strawberry

回答

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') 

每当你插入一个被邀请的人时,用concat以前的值与新的被邀请的人一起做。你已经打了他们。你不需要使用很多查询,只需要一个。

看看this DEMO

+0

如果有另一个级别的邀请(说用户F邀请G),那么你需要添加另一个'JOIN'和另一个“计数”? –

+0

@echo_Me谢谢你的回答,我猜它会帮助我,请你检查一下我的更新,让我知道你的想法。 – trrrrrrm

+0

@CarlosCampderrós真的,谢谢,但我想如果我按照更新的方法,这可能会帮助 – trrrrrrm