Ordinamento casuale in Access + ASP

sql

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. ok emoticon

This entry was posted in ASP, Programmazione, SQL and tagged , , , , , , , , , . Bookmark the permalink.

2 Responses to Ordinamento casuale in Access + ASP

  1. Claudio Pistidda says:

    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.

  2. Denis says:

    Claudio Pistidda:

    evidentemente non è affidabile.

    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.

    Claudio Pistidda:

    Pero ho provato ad alternare l’ordinamento con ASC e DESC e sembrerebbe molto piu random. se non altro ad ogni refresh qualcosa cambia.

    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

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>