# ActiveRecord come trovare i record prima e dopo

**URL:** <https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240>\
**Category:** IT\
**Created:** [March 16, 2010, 5:14pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240 "2010-03-16T17:14:09Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 16, 2010, 5:14pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/1 "2010-03-16T17:14:09Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 16, 2010, 5:40pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/2 "2010-03-16T17:40:07Z")

</div>

Ciao Simone,

faresti un esempio con una manciata di dati?

Ciao,  
Silvano

2010/3/16 Simone R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> ## Grazie
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](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: removed\_email\_address@domain.invalid  
site: [http://www.sistrall.it](http://www.sistrall.it)

---

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 16, 2010, 5:58pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/3 "2010-03-16T17:58:15Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 16, 2010, 7:29pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/4 "2010-03-16T19:29:00Z")

</div>

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. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 16, 2010, 7:31pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/5 "2010-03-16T19:31:55Z")

</div>

> 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

---

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 16, 2010, 9:38pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/6 "2010-03-16T21:38:56Z")

</div>

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. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 18, 2010, 3:34pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/7 "2010-03-18T15:34:21Z")

</div>

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 😃 😃

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

---

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 18, 2010, 3:56pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/8 "2010-03-18T15:56:50Z")

</div>

2010/3/18 Simone R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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

---

<div class="post-metadata">

**Author:** ![ialuronico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c4cdca/32.png) [@ialuronico](https://www.ruby-forum.com/u/ialuronico)\
**Post date:** [March 16, 2010, 7:44pm UTC](https://www.ruby-forum.com/t/activerecord-come-trovare-i-record-prima-e-dopo/185240/9 "2010-03-16T19:44:48Z")

</div>

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.welton.it/davidw/)

[http://www.dedasys.com/](http://www.dedasys.com/)
