ActiveRecord come trovare i record prima e dopo

Salve a tutti,

devo fare una classifica di utenti in base al loro punteggio e mostrare
oltre all’ utente corrente i 3 prima di lui ed i 3 dopo di lui in
classifica.

Soprattutto mi piacerebbe riuscirci con una query sola , senza cercare
prima l’utente e trovare il suo rank in classifica e poi fare una
seconda query con limit 7 e con offset (ranking utente-3)

Grazie

Ciao Simone,

faresti un esempio con una manciata di dati?

Ciao,
Silvano

2010/3/16 Simone R. [email protected]:

Grazie

Posted via http://www.ruby-forum.com/.


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Considera l’ambiente prima di stampare questa email. Be a total user
rather than a complete waster.

. . . Silvano S. . . .
email: [email protected]
site: http://www.sistrall.it

Questa e’ la classifica nel database

plato 40
pippo 33
pluto 32
paolo 27
carlo 23
santo 19
nardo 18
natro 15
navro 14
sando 12
wando 11
drado 9
valdo 8
farad 5
trasd 4
vaddo 3

quello che mi serve e’ una query a cui passando come parametro (santo)
mi restituisca

pluto 32
paolo 27
carlo 23
santo 19
nardo 18
natro 15
navro 14

Grazie Simone

Una unica query?
mi sento di dire con buona certezza che in una query è pressoche
impossibile,
al massimo si può fare con alcune query annidate, ma anche cosi è complesso.

Su oracle ti può essere utile fare delle subquery usando il rownum.
Non conosco però equivalenti su postgres o mysql

ciao
S

Però obbiettivamente, perche una sola query?

2010/3/16 Simone R. [email protected]

Per� obbiettivamente, perche una sola query?

performance , se chiamo 2 volte il DB genero il doppio del carico sul DB

p.s. l’ideale sarebbe riuscirci con ActiveRecord , cosi’ e’ indipendente
dal DB

una query puntuale, non è pesante, il carico lo hai con query pesanti.
con 1 o due query, soprattutto se le query sono puntuali e senza join,
la
complessità è sempre O(1)

KISS

ciao
S

2010/3/16 Simone R. [email protected]

Simone F. wrote:

una query puntuale, non è pesante, il carico lo hai con query pesanti.
con 1 o due query, soprattutto se le query sono puntuali e senza join,
la complessità è sempre O(1)

ho ripensato un po’ su questo punto di vista e visto che sei mio omonimo
ho deciso di fidarmi :smiley: :smiley:

La tabella utenti e’ gia’ in mememoria perche’ subito prima
ho dovuto fare la validazione e quindi ho anche gia’ in memoria
il punteggio dell’ utente attuale,
quindi in teoria con due select ordinate per punteggio una con < di
@user.score e l’altra con >= sempre di @user.score ,una con limit 3
l’altra con limit 4 , una con order by score desc e l’altra con order by
score asc
e unendo i risultati dovrei ottenere quello che mi serve

Sempre in teoria considerando che comunque la tabella e’ sempre in
memoria per
le validazioni degli utenti con un indice sulla colonna score il
tutto dovrebbe girare abbastanza bene

2010/3/18 Simone R. [email protected]:

La tabella utenti e’ gia’ in mememoria perche’ subito prima
ho dovuto fare la validazione e quindi ho anche gia’ in memoria
il punteggio dell’ utente attuale,

ah se hai gia’ il punteggio dell’utente attuale (e non solo il suo ID)
puoi fare una sola query (usando la union) per trovare i “vicini”,
tipo:

select * from users where score <= :current_user_score AND id <
:current_user_id order by score desc, id desc limit 3
union
select * from users where score >= :current_user_score AND id >
:current_user_id order by score asc, id asc limit 3

ciao,
Luca

Forse qualcosa del genere:

# Most voted tweets
@votedtweets = Status.find(:all, :include => ['tuser', 'votes'],

:joins => “join (select status_id, count(distinct user_id) as cnt from
votes, statuses where votes.status_id = statuses.id and
statuses.tcreated_at > ‘#{1.week.ago}’ group by status_id,
statuses.tcreated_at order by cnt desc, tcreated_at desc limit 5) as
mystats on mystats.status_id = statuses.id”, :order => ‘mystats.cnt
desc, tcreated_at desc’)

Funziona bene su postgres.


David N. Welton

http://www.welton.it/davidw/

http://www.dedasys.com/