كيفية تنفيذ ميزة "رئيس البلدية" في Foursquare - ابحث عن المستخدم الذي يحمل أعلى درجة في الأيام الأخيرة؟

StackOverflow https://stackoverflow.com/questions/3682135

سؤال

في شخصيات قصص القدمين ، يتم منح المستخدم الذي يحصل على أعلى الدرجات لمكان في الأيام الأخيرة عمدة هذا المكان.

ما هي الطريقة الأكثر كفاءة لتنفيذ ذلك؟

يمكن للمستخدم فحص مئات الأماكن. لعرض جميع العمدة التي تنتمي إلى مستخدم ، سيكون من الضروري المرور بكل هذه الأماكن واحدة تلو الأخرى والتحقق مما إذا كان لديه أعلى الدرجات في آخر 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';
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top