
Primo articolo per quanto riguarda l’SQL, il più famoso linguaggio di interrogazione per database. Il problema riguarda l’ordinamento casuale dei record di una qualsiasi tabella su un database Access. Su SQLServer risolvere il problema è abbastanza semplice, basta infatti specificare un ordinamento del tipo:
SELECT * FROM tabella ORDER BY NEWID();
ed il gioco è fatto. Questo tipo di approccio invece non è possibile se il database che stiamo usando è un database Access.
Ecco perciò come ho risolto:
SELECT * FROM tabella ORDER BY Rnd((ID+Timer())*-1);
e quindi nel complesso:
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open Server.MapPath("/mdb-database/accademia.mdb")
set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM tabella ORDER BY Rnd((ID+Timer())*-1)", conn
Essendo la funzione Timer() precisa al centesimo di secondo, è praticamente impossibile ottenere due query ordinate nello stesso modo. Il campo ID deve essere ovviamente numerico e nel mio caso è autoincrementale. Grazie a questo tip ho risparmiato ore di lavoro inutile, devo perciò ringraziare la fonte dell’informazione, il blog di Lorenzo Benaglia e soprattutto il commentatore Giorgio Rancati che ha proposto questa soluzione. ![]()
Mi chiamo Denis Billi, ho 25 anni e sono della provincia di Ravenna. Mi sono laureato nell'estate del 2008 presso la facoltà di Ingegneria Informatica dell'università di Bologna e attualmente sto seguendo i corsi per la Laurea Specialistica in Ingegneria Informatica sempre all'università di Bologna.
Ciao! Ho provato la vostra soluzione, ma non era veramente casuale.
Eppure la funzione rnd, dovrebbe servire proprio a questo… evidentemente non è affidabile.
Pero ho provato ad alternare l’ordinamento con ASC e DESC e sembrerebbe molto piu random. se non altro ad ogni refresh qualcosa cambia.
Ho messo ASC e DESC in una variabile di sessione session(“RanOrdering”) e li alterno ad ogni caricamento.
Ditemi cosa ne pensate!
Ciao ragazzi e grazie per i vostri post.
La funzione Rnd si affida ad un generatore PseudoCasuale, la casualità non è deterministica (sembra una banalità, ma per molto non è così) e per ottenerla servirebbero generatori molto più complessi.
Ti dirò, quando provai questa soluzione al tempo, ho constatato che comunque è “abbastanza” casuale per quello di cui avevo bisogno. So che esistono altre soluzioni, ma per brevità ed efficienza ho scelto questa. Proverò comunque anche la soluzione da te postata (che non richiede un grande dispendio di risorse in più) per confrontarla con questa.
Grazie per il tuo contributo e torna a trovarmi. A presto,
Denis