Per chi crea siti Web capita prima o poi di trovarsi davanti ad un problema insormontabile: lavorare in ASP+Access, l’accoppiata vincente di Microsoft oramai superata in tutto e per tutto dal binomio PHP+MySQL. Tuttavia non tutto è perduto e ci armiamo di buona pazienza in modo da far funzionare tutto per il meglio, quando ecco sorgere problemi insospettabili. Supponiamo ad esempio di voler caricare dal DB un numero limitato di risultati di una query, caso tipico della LIMIT di MySQL e della TOP per i sistemi Microsoft, ad esempio per un sistema di visualizzazione delle news. Supponendo di avere un codice SQL del tipo:
SELECT TOP 5 * FROM tbEventi ORDER BY Data DESC
Ci aspettiamo che il codice qui sopra carichi dal DB esattamente i primi 5 risultati delle news ordinate per data. Cosa accade però se in lista ci sono più eventi della stessa giornata dei quali non abbiamo definito un ordinamento? Un caso d’esempio della tabella tbEventi è questo qui sotto:
ID Titolo Testo Data ---------------------------------- 1 Titolo1 Testo1 19/05/2009 2 Titolo2 Testo2 19/05/2009 3 Titolo3 Testo3 18/05/2009 4 Titolo4 Testo4 17/05/2009 5 Titolo5 Testo5 17/05/2009 6 Titolo6 Testo6 17/05/2009 7 Titolo7 Testo7 16/05/2009 8 Titolo8 Testo8 16/05/2009
In questo caso avrete come risultato della query questo:
ID Titolo Testo Data ---------------------------------- 1 Titolo1 Testo1 19/05/2009 2 Titolo2 Testo2 19/05/2009 3 Titolo3 Testo3 18/05/2009 4 Titolo4 Testo4 17/05/2009 5 Titolo5 Testo5 17/05/2009 6 Titolo6 Testo6 17/05/2009 7 Titolo7 Testo7 16/05/2009 8 Titolo8 Testo8 16/05/2009
Che è esattamente la tabella iniziale. Come mai? E’ molto semplice, a date uguali viene data la stessa importanza, si verifica cioè un aexequo che porta come risultato l’uscita di tutte le entry con le prime 5 date disponibili, ed in questo caso avremo il 19, il 18, il 17 ed il 16 maggio.
Come risolvere?
Facile, ci sono 2 modi: o definiamo un secondo modo di ordinamento, come questo:
SELECT TOP 5 * FROM tbEventi ORDER BY Data, Titolo DESC
In modo da permettere all’engine di discriminare tra entry della stessa data, oppure in una maniera più “sporca” facendo una sotto-query:
SELECT TOP 5 FROM (SELECT TOP 5 * FROM tbEventi ORDER BY Data DESC) ORDER BY Data DESC
Fine. Se vi vengono in mente altre modalità per risolvere il problema, fatemelo sapere!
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.