具体思路如下:
我们认为排名靠近的用户的相似度高,因此会为目标用户推荐与其排名靠近的用户做过的题。
即A,B两个用户是排名靠近的两个用户,对A推荐的题目则是B对A的差集(阴影部分)
用数据库语句实现如下:
user_id 为用户名
rec_list为排名靠近的用户
number 为 推荐题目
solution 为 用户提交记录(包含用户名,题目名称)
def produce_rec_sql(rec_list, user_id, number):
sql1 = '''
drop view if exists union_view ;
create view union_view as(
SELECT distinct(problem_id) as dis_pid
from solution p_sol
where user_id in('{}','{}','{}','{}','{}','{}')) ;
drop view if exists single_view ;
create view single_view as(
select distinct(problem_id) as single_pid
from solution
where user_id= '{}'
);
'''.format(rec_list[0], rec_list[1], rec_list[2], rec_list[3], rec_list[4], rec_list[5], user_id)
sql2 = '''
select *
from union_view t
where not exists(
SELECT *
FROM
single_view svw
WHERE
t.dis_pid = svw.single_pid
) limit {};
'''.format(number)
return sql1, sql2