# RANDOM query per Mysql e Postgresql

**URL:** <https://www.ruby-forum.com/t/random-query-per-mysql-e-postgresql/237063>\
**Category:** IT\
**Created:** [October 22, 2013, 7:36pm UTC](https://www.ruby-forum.com/t/random-query-per-mysql-e-postgresql/237063 "2013-10-22T19:36:56Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![addis\_a](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c4cdca/32.png) [@addis\_a](https://www.ruby-forum.com/u/addis_a)\
**Post date:** [October 22, 2013, 7:36pm UTC](https://www.ruby-forum.com/t/random-query-per-mysql-e-postgresql/237063/1 "2013-10-22T19:36:56Z")

</div>

Ciao a tutti, nella mia applicazione voglio visualizzare in hp un’  
immagine presa a casa dal db.

In development uso Mysql, mentre in production (heroku) uso Postgresql e  
ho scoperto, da bel neofita, che le query è differente per i due  
database:

- per Mysql si usa RANDOM =\> es: Photo.order(“RAND()”).first
- per Pg si usa RAND =\> es: Photo.order(“RANDOM()”).first

Cercando in internet ho trovato questa semplice e pulita query che  
risolve il problema e che va bene per entrambi gli enviroment:

@photo = Photo.find :first, :offset =\> rand(Photo.count)

Come vi comportate voi? è il modo migliore?  
Grazie in anticipo a chiunque mi risponderà.

Alberto

---

<div class="post-metadata">

**Author:** ![albertobraschi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/87869e/32.png) [@albertobraschi](https://www.ruby-forum.com/u/albertobraschi)\
**Post date:** [October 22, 2013, 7:48pm UTC](https://www.ruby-forum.com/t/random-query-per-mysql-e-postgresql/237063/2 "2013-10-22T19:48:48Z")

</div>

In teoria ActiveRecord dovrebbe fungere da astrazione, ed cos infatti  
nella maggior parte dei casi.  
Se sei un neofita ti direi di non preoccuparti troppo della tipologia di  
database sottostante, ma ti sei reso conto da solo che ci sono delle  
differenze tra i vari database che possono uscire fuori.  
Spesso sono evidenti come in questo caso, in altre situazioni sono meno  
evidenti e ti possono far perdere tempo con bug e comportamenti  
inaspettati.  
Pi complesso il progetto, pi di frequente avrai bisogno di allontanarti  
dalle funzionalit di ActiveRecord per fare delle query a mano o usare  
feature particolari del database.

Nel caso specifico direi che la soluzione va pi che bene, mi hai fatto  
ricordare del parametro :offset che non uso tanto spesso.

---

<div class="post-metadata">

**Author:** ![albertobraschi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/87869e/32.png) [@albertobraschi](https://www.ruby-forum.com/u/albertobraschi)\
**Post date:** [October 22, 2013, 7:51pm UTC](https://www.ruby-forum.com/t/random-query-per-mysql-e-postgresql/237063/3 "2013-10-22T19:51:09Z")

</div>

A prescindere dal fatto che ti consiglio di usare in sviluppo lo stesso  
ambiente di sviluppo, non c’ una soluzione definitiva

Entrambe hanno pro e contro. Personalmente, se il data set limitato io  
uso in genere

Photo.find Photo.pluck(:id).sample

Photo.pluck mi ritorna tutte le primary key in un array, sample ne  
sceglie  
una random.

– Simone

On Tuesday, October 22, 2013, Alberto B. wrote:

> risolve il problema e che va bene per entrambi gli enviroment:
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid \<javascript:;\>  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Simone C.  
Passionate programmer and dive instructor

> **[Simone Carletti — Underwater programmer](https://simonecarletti.com/)**
>
> Simone Carletti is a programmer with an insane passion for code quality.

Twitter: @weppos [https://twitter.com/weppos](https://twitter.com/weppos)

---

<div class="post-metadata">

**Author:** ![albertobraschi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/87869e/32.png) [@albertobraschi](https://www.ruby-forum.com/u/albertobraschi)\
**Post date:** [October 23, 2013, 11:29am UTC](https://www.ruby-forum.com/t/random-query-per-mysql-e-postgresql/237063/4 "2013-10-23T11:29:58Z")

</div>

Alberto, la tua query mi pare la migliore perché funziona bene anche con  
tanti record, ma è un peccato dover passare per la select count.

Il mio consiglio è usare lo stesso database sia in sviluppo che in  
produzione. Usandone due diversi prima o poi accadrà un guaio, se non  
hai anche un sistema di test con lo stesso db di produzione.  
ActiveRecord astrae bene sui db ed Heroku contribuisce a nascondere il  
database, però ti esponi a tutti i bug di AR che dipendono dal db  
sottostante (ce ne sono stati, ce ne saranno) e soprattutto alle  
differenti opinioni dei due db sui risultati di certe query (trattamento  
dei null, date, unique values nelle transazioni, etc). In parole povere,  
i tuoi test che passano su mysql potrebbero non passare su postgresql e  
viceversa.

Con lo stesso database oltre a dormire più tranquillo potrai usare la  
RANDOM() di postgresql che mi aspetto produca una query più veloce della  
combinazione delle due che usi adesso, ma va verificato.

Ciao  
Paolo

---

<div class="post-metadata">

**Author:** ![albertobraschi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/87869e/32.png) [@albertobraschi](https://www.ruby-forum.com/u/albertobraschi)\
**Post date:** [October 23, 2013, 11:42am UTC](https://www.ruby-forum.com/t/random-query-per-mysql-e-postgresql/237063/5 "2013-10-23T11:42:38Z")

</div>

2013/10/23 Paolo M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Alberto, la tua query mi pare la migliore perch funziona bene anche con  
> tanti record, ma un peccato dover passare per la select count.

> <https://stackoverflow.com/questions/5297396/quick-random-row-selection-in-postgres>

A quanto pare potrebbe essere meglio un count che un random(), ma  
bisogna analizzare tutti e due i query, e tener conto della quantita`  
di dati…

–  
David N. Welton

[http://www.welton.it/davidw/](http://www.welton.it/davidw/)

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