كيفية تنفيذ ميزة "رئيس البلدية" في Foursquare - ابحث عن المستخدم الذي يحمل أعلى درجة في الأيام الأخيرة؟
-
02-10-2019 - |
سؤال
في شخصيات قصص القدمين ، يتم منح المستخدم الذي يحصل على أعلى الدرجات لمكان في الأيام الأخيرة عمدة هذا المكان.
ما هي الطريقة الأكثر كفاءة لتنفيذ ذلك؟
يمكن للمستخدم فحص مئات الأماكن. لعرض جميع العمدة التي تنتمي إلى مستخدم ، سيكون من الضروري المرور بكل هذه الأماكن واحدة تلو الأخرى والتحقق مما إذا كان لديه أعلى الدرجات في آخر 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';
لا تنتمي إلى StackOverflow