0

Foursquare では、過去 N 日間にある場所で最高のスコアを獲得したユーザーに、その場所の市長が授与されます。

それを実装する最も効率的な方法は何ですか?

ユーザーは何百もの場所にチェックインできた可能性があります。ユーザーが所有するすべての市長職を表示するには、何百もの場所を 1 つずつ調べて、各場所で過去 60 日間の最高スコアを持っているかどうかを確認する必要があります。これは非常に非効率に思えます。

タスクをすばやく実行できる SQL またはアルゴリズムの魔法はありますか?

更新: MySQL と Django を使用しています

4

1 に答える 1

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';
于 2010-09-10T05:37:59.407 に答える