如何实施Foursquare的“市长”功能 - 找到过去N天内得分最高的用户?

时间:2010-09-10 03:45:45

标签: sql mysql aggregate foursquare leaderboard

在Foursquare中,过去N天内获得最高分的用户将被授予该地区的市长。

实施该方法的最有效方法是什么?

用户可以检查数百个地方。为了显示属于用户的所有市长,有必要逐个浏览所有这几百个地方并检查他在过去60天内每个地方的得分是否最高 - 这听起来非常低效。

是否有任何可以快速执行任务的SQL或算法魔法?

更新:我正在使用MySQL和Django

1 个答案:

答案 0 :(得分:1)

我会在地方表中保留“当前专业”,并不时更新。示例(我不知道数据模型是否正确):

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';