2010-09-10 31 views
0

在Foursquare中,在過去N天中得分最高的用戶將獲得該地區的市長榮譽。如何實現Foursquare的「市長」功能 - 在過去的N天內找到用戶得分最高的用戶?

什麼是最有效的方式來實現呢?

用戶可能已經檢查了數百個位置。爲了顯示屬於某個用戶的所有市長職位,有必要逐一瀏覽所有這些數百個地方,並檢查他是否在過去60天內獲得了每個地方的最高分 - 這聽起來效率很低。

是否有任何SQL或算法魔術可以快速執行任務?

UPDATE:我使用MySQL和Django的

+0

需要爲我們這些不熟悉遊戲的人提供表格和它們的列(s)...聽起來很簡單,只需要要知道是否有什麼特別的分數列表。另外,你(和你怎麼)打破關係? – 2010-09-10 03:50:39

回答

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

我忘了打破關係。我想你需要一些額外的邏輯,例如通過sum(points)desc,user_joined命令(假設老用戶總是贏) – 2010-09-10 05:41:33

相關問題