在 Foursquare 中,在过去 N 天内对某个地方得分最高的用户将获得该地方的市长职位。
实现它的最有效方法是什么?
一个用户可能已经检查了数百个地方。要显示属于一个用户的所有市长职位,需要一个一个地遍历所有这数百个地方,并检查他在过去 60 天内每个地方的得分是否最高——这听起来效率很低。
是否有任何可以快速执行任务的 SQL 或算法魔法?
更新:我正在使用 MySQL 和 Django
在 Foursquare 中,在过去 N 天内对某个地方得分最高的用户将获得该地方的市长职位。
实现它的最有效方法是什么?
一个用户可能已经检查了数百个地方。要显示属于一个用户的所有市长职位,需要一个一个地遍历所有这数百个地方,并检查他在过去 60 天内每个地方的得分是否最高——这听起来效率很低。
是否有任何可以快速执行任务的 SQL 或算法魔法?
更新:我正在使用 MySQL 和 Django
我会将“当前专业”保留在位置表中,并不时更新。示例(我不知道数据模型是否正确):
drop table place;
create table place(name varchar(20) primary key, major varchar(20));
insert into place values('NY', null), ('LA', null);
create index idx_p_m on place(major);
drop table visits;
create table visits(user varchar(20), place varchar(20), points int, day int);
create index idx_v_p on visits(place, day desc);
insert into visits values
('Ben', 'NY', 1, 100),
('Ben', 'LA', 3, 102),
('Joe', 'NY', 2, 103),
('Joe', 'LA', 1, 104);
-- just to prove this is efficient
explain select user from visits v where v.place = 'NY'
and day > 90
group by user
order by sum(points) desc
limit 1;
update place p set major =
(select user from visits v where p.name = v.place
and day > 90
group by user
order by sum(points) desc
limit 1);
select * from place where major = 'Joe';
select * from place where name = 'LA';