【Python】递归函数-获取最初推荐人id

本文介绍了一种使用Python和MySQL结合递归方法查询多级推荐关系中最初推荐人的实现方案。通过递归函数遍历推荐关系表,直到找到邀请序列号为0的最初推荐人。

递归函数,我理解为函数内调用自身函数。理解可能不全面,欢迎指正。

从推荐关系表,获取最初推荐人id。推荐关系是无限的,无限是指,A是B推荐的,B是C推荐的,C是D推荐的… 直到N没有任何推荐人。因为,推荐关系表只存储了直接推荐关系,需要递归获取最初推荐人id。

user_inviter_relation推荐关系表 结构如下(纯属虚构,如有雷同纯属巧合):
user_id:用户id
user_name:用户名
create_time:创建时间
inviter_id:推荐人id
inviter_name:推荐人名
invite_num:推荐人序列(当推荐人序列为0,表示该推荐人没有推荐人,是最初的推荐人)

iduser_iduser_namecreate_timeinviter_idinviter_nameinvite_num
432123456赵四2021-03-01 09:00:01456789尼古拉斯3
569456789尼古拉斯2021-02-15 09:00:01258369刘小光0
# -*- coding: utf-8 -*-
### Python 3.7
import pymysql


"""
第一步:从MySQL数据库获取数据
第二步:递归函数 获取最初邀请人

"""

def all_query(sql,database='abc'):
   connection=pymysql.connect(host='abc123',port=3306,user='admin',password='asdfghj',db=database,charset='utf8')
    cur = connection.cursor()

    sql_select = sql
    cur.execute(sql_select)

    result = cur.fetchall()
    col_result = cur.description

    #获取字段信息
    columns = []
    for i in range(len(col_result)):
        columns.append(col_result[i][0])
    #插入数据
    data=[]
    for i in range(len(result)):
        result_dict=dict(zip(columns,list(result[i])))
        data.append(result_dict)
        cur.close()
    return data


user_sql="""
select 
user_id,inviter_id,invite_num
from user_inviter_relation
"""
query=all_query(user_sql)


# query 是list格式存储,转为以user_id为key的字典
def list_to_dict(result):
    _dict={}
    for index,item in enumerate(result):
        _dict[item ['user_id']]=[item ['inviter_id'],b['invite_num']]
    return _dict

all_info=list_to_dict(query)


def recursion(user_id,query,all_info):
    chain_dict={}
    for index,item in enumerate(query):
    	# 如果传入的user_id参数,在query里
        if user_id== item['user_id']:
        	# 当推荐人序列为0时,该推荐人为最初的推荐人
            if item['inviter_level'] == 0:
                chain_dict[user_id] =item['inviter_id']
            # 当推荐人序列不为0时,该推荐人不是最初推荐人,获取该推荐人的推荐人信息,一直递归,直到第N个推荐人序列为0,找到最初的推荐人
            elif item['invite_num'] != 0:
                chain_dict[user_id] = [item['inviter_id'],item['invite_num']]

                chain_dict[user_id][0] = all_info[chain_dict[user_id][0]][1]
                chain_dict[user_id][1]= all_info[chain_dict[user_id][0]][2]
                
                return recursion(user_id,query,all_info)
   
    return chain_dict

test=recursion(123456,query,all_info)
print(test)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值