问题

注意:我正在使用MySQL或python

编辑:为了按照用户建议使我的问题MRE:草莓,我创建了我的表(创建,删除表并不真正需要,所以我只是使用了所有相同的日期):

 CREATE table invites (
  ID                INT AUTO_INCREMENT,
  invitee_id        INT,
  inviter_id        INT,
  inviter_user_code VARCHAR(20),
  created_at        datetime,
  updated_at        datetime,
  PRIMARY KEY (ID)
); 
INSERT INTO invites (invitee_id, inviter_id, inviter_user_code, created_at,updated_at)
VALUES 
  (17365, 17374, 'BDMX5Z', '2019-02-01', '2019-02-01'),
  (17401, 17349, 'BDMX58', '2019-02-01', '2019-02-01'),
  (17403, 17349, 'BDMX58', '2019-02-01', '2019-02-01'),
  (17452, 17349, 'BDMX8C', '2019-02-01', '2019-02-01'),
  (17457, 17449, 'BDMX8J', '2019-02-01', '2019-02-01');
 

要清楚这是我的数据帧的样子:

     id invitee_id   inviter_id  inviter_user_code   created_at           updated_at
    1   17375       17374             BDMX5Z    2019-02-01 10:28:44 2019-02-01 10:28:44
    2   17401       17349             BDMX58    2019-02-01 11:59:47 2019-02-01 11:59:47
    3   17403       17349             BDMX58    2019-02-01 12:03:22 2019-02-01 12:03:22
    4   17452       17449             BDMX8C    2019-02-01 13:39:31 2019-02-01 13:39:31
    5   17457       17455             BDMX8J    2019-02-01 14:00:25 2019-02-01 14:00:25
    6   17502       17501             BDMX9Y    2019-02-01 15:50:44 2019-02-01 15:50:44
    7   17541       17540             BDMXB7    2019-02-01 17:15:06 2019-02-01 17:15:06
    8   17542       17546             BDMXBD    2019-02-01 17:34:48 2019-02-01 17:34:48
    9   17696       17630             BDMXDZ    2019-02-02 11:46:14 2019-02-02 11:46:14
    10  17706       13191             BDMT3A    2019-02-02 12:23:47 2019-02-02 12:23:47
 

invitee_id是被邀请的用户.
2001年12月31日终了的两年期收入和支出及准备金和基金结余变动报表 inviter_id是用户邀请新用户的。

因此,如果首先邀请没有事先邀请inviter_id将不包含在invitee_id中.

为此我做了

 select 
  *
from user_invitations
where
  inviter_id in
    (select invitee_id
     from user_invitations)
 

在此之后,我将使用inviter_id作为以前邀请的调用符.

我的问题是如何使用先前邀请(也有先前邀请的人)调用服务器等...
2001年12月31日终了的两年期收入和支出及准备金和基金结余变动报表 我在mysql中直接尝试了多种方法,并创建了df并使用它.

在结果表上执行上述查询,如:

 With one_prior as (
    select 
      *
    from user_invitations
    where
      inviter_id in
        (select invitee_id
          from user_invitations)
) 
select *
from one_prior
where 
  inviter_id in
   (select invitee_id 
    from one_prior);
 

我手动检查了一个用户,但是如果有办法检查所有用户,似乎是对的?

我创建了两个查询:

 select *
from user_invitations
where inviter_id = 17349;


select *
from user_invitations
where invitee_id = 23764;
 

然后往后检查。 例如,如果inveriter_id = 17349首先邀请而没有事先邀请它将不会出现在第二个查询中.然后从使用invirter_id = 17349的第一个查询结果我得到tribeee_id = 17401,17403等.然后我现在将它们作为invirter_id进入第一个查询.重复步骤.

此外,有没有办法创建一个分布式点图,其中每个点代表用户,并且有一条连接具有“调用/邀请”关系的用户的线路?

编辑: 说我正在做的第五个链接,代码似乎很长而且繁琐,我希望找到更有效的方法.

 query = """
With five_prior as
(
    With four_prior as
    (
        With three_prior as 
        (
            With two_prior as 
            (
                With one_prior as 
                (
                    select 
                      *
                    from user_invitations
                    where inviter_id in
                          (select invitee_id
                          from user_invitations)
                ) 
            select *
            from one_prior
            where inviter_id in
                  (select invitee_id 
                   from one_prior)
            ) 
        select *
        from two_prior
        where inviter_id in
              (select invitee_id 
               from two_prior)
        )
    select *
    from three_prior
    where inviter_id in
          (select invitee_id
           from three_prior)
    )
select *
from four_prior
where inviter_id in
      (select invitee_id
       from four_prior)
)

select *
from five_prior
where inviter_id in
      (select invitee_id
       from five_prior)
group by inviter_id
"""
df = pd.read_sql(query, con=conn)

five_link = list(df.inviter_id)
print(len(five_link))
 

  最佳答案

这是一种简单的方法,您可以在python中执行此操作,使用动态编程解决方案:

 previous_invites = { r["invitee"]: 0 for r in rows }

changed = True

while changed:
  changed = False
  for r in rows:
    update_prev_invites = max(previous_invites[r["invitee"]], previous_invites.get(r["inviter"], 0) + 1)
    if update_prev_invites > previous_invites[r["invitee"]]:
      changed = True
      previous_invites[r["invitee"]] = update_prev_invites

for r in rows:
  print "User " + str(r["id"]) + " had a chain of " + str(previous_invites[r["invitee"]]) + " inviter(s) behind them"
 

这假设rows是一个包含数据库中数据的字典数组.它通过将被邀请者previous_invites值设置为其调用者+1的previous_invites来构建previous_invites字典(它将被邀请者映射到他们的’链’中的调用者数量).这个循环运行直到字典收敛到正确的答案.

由于 n 用户和 m 是最长的调用链的长度,这个解决方案运行在 O(n) 空间和 O(n* m) 时间。

  相同标签的其他问题

pythonmysql