【问题标题】:Referred friends points query推荐好友积分查询
【发布时间】:2013-07-29 03:17:58
【问题描述】:

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

我的 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 次查询,直到到达该用户的邀请树底部
  • 我想一旦表格达到平衡状态,逻辑就会变得容易得多。

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

【问题讨论】:

  • 唯一的解决方案是通过存储过程或在您的应用程序中运行多个查询(取决于最大“朋友深度”)。
  • 如果F邀请G,E也得一分? G邀请H,E加分?
  • 这是MySQL中递归的问题。因此,这是一个常见问题解答。
  • @Vatev 感谢您的回答,知道什么是最好的方法吗?我用一些想法更新了我的问题,让我知道你的想法
  • @Zelldon 是的,这就是我要找的东西

标签: mysql sql


【解决方案1】:

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

 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:

我的想法很好,如果你想这样做当然取决于你。

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

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

看看this DEMO

【讨论】:

  • 如果有其他级别的邀请(比如用户 F 邀请 G),那么您需要添加另一个 JOIN 和另一个 count
  • @echo_Me 谢谢你的回答,我想这对我有帮助,请检查我的更新,让我知道你的想法。
  • @CarlosCampderrós 是的,谢谢,但我想如果我遵循更新的方法,这可能会有所帮助
  • @ra_htial 如果你想看看我的想法,这只是我的意见,当然这取决于你,看看 EDIT2。希望对你有帮助。
猜你喜欢
  • 2015-06-02
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多