gpt4 book ai didi

python - 在邀请人和被邀请人的列中如何找到具有 1、2、3 个先前邀请的邀请?

转载 作者:行者123 更新时间:2023-11-29 05:47:45 25 4
gpt4 key购买 nike

注意:我可以使用 MySQL 或 python

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

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 是被邀请的用户。
inviter_id 是邀请新用户的用户。

因此,如果您是第一个邀请而没有事先邀请,inviter_id 将不会包含在 invitee_id 中。

为此我已经做到了

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

在此之后,我将拥有 inviter_id 作为邀请人,并获得事先邀请。

我的问题是如何获得有事先邀请的邀请人(由谁也有事先邀请)等等...
我直接在 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;

来回检查。例如,如果 inviter_id=17349 是第一个邀请而没有事先邀请,则它不会出现在第二个查询中。然后从 inviter_id=17349 的第一个查询结果中,我得到 invitee_id = 17401、17403 等。然后我现在将它们作为 inviter_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。这个循环一直运行,直到字典收敛到正确的答案。

n 个用户,m 是最长邀请者链的长度,此解决方案在 O(n) 空间和 O(n*m) 时间中运行。

关于python - 在邀请人和被邀请人的列中如何找到具有 1、2、3 个先前邀请的邀请?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58126434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com