Come implementare funzionalità “Sindaco” di Foursquare - trovare l'utente con il punteggio più alto negli ultimi giorni N?

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

Domanda

In Foursquare, l'utente che ha il punteggio più alto per un posto negli ultimi giorni N è assegnato il Mayorship di quel luogo.

Qual è il modo più efficiente per attuare tale?

Un utente potrebbe avere controllato in centinaia di posti. Per visualizzare tutti i mayorships che appartengono ad un utente, sarebbe necessario passare attraverso tutte quelle centinaia di posti uno per uno e verificare se ha il punteggio più alto negli ultimi 60 giorni per ogni posto-- che i suoni molto inefficiente.

C'è uno SQL o la magia algoritmico che potrebbero svolgere il compito in fretta?

UPDATE: Sto usando MySQL e Django

È stato utile?

Soluzione

Vorrei mantenere la 'corrente principale' nella tabella luogo, e aggiornamento che di tanto in tanto. Esempio (non ho idea se il modello di dati sono corretti):

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';
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top