在Foursquare中,在過去N天中得分最高的用戶將獲得該地區的市長榮譽。如何實現Foursquare的「市長」功能 - 在過去的N天內找到用戶得分最高的用戶?
什麼是最有效的方式來實現呢?
用戶可能已經檢查了數百個位置。爲了顯示屬於某個用戶的所有市長職位,有必要逐一瀏覽所有這些數百個地方,並檢查他是否在過去60天內獲得了每個地方的最高分 - 這聽起來效率很低。
是否有任何SQL或算法魔術可以快速執行任務?
UPDATE:我使用MySQL和Django的
在Foursquare中,在過去N天中得分最高的用戶將獲得該地區的市長榮譽。如何實現Foursquare的「市長」功能 - 在過去的N天內找到用戶得分最高的用戶?
什麼是最有效的方式來實現呢?
用戶可能已經檢查了數百個位置。爲了顯示屬於某個用戶的所有市長職位,有必要逐一瀏覽所有這些數百個地方,並檢查他是否在過去60天內獲得了每個地方的最高分 - 這聽起來效率很低。
是否有任何SQL或算法魔術可以快速執行任務?
UPDATE:我使用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';
我忘了打破關係。我想你需要一些額外的邏輯,例如通過sum(points)desc,user_joined命令(假設老用戶總是贏) – 2010-09-10 05:41:33
需要爲我們這些不熟悉遊戲的人提供表格和它們的列(s)...聽起來很簡單,只需要要知道是否有什麼特別的分數列表。另外,你(和你怎麼)打破關係? – 2010-09-10 03:50:39