Ordinare i record con la clausola ORDER BY
Gli argomenti di questa pagina
- La clausola ORDER BY
- Tipo di ordinamento
- Ordinamento su una o più colonne
- Codice per eseguire le Query
- Alcuni esempi
- Ordinamento casuale con ORDER BY RAND()
|
Quando una Query genera un resultset, normalmente i record non seguono alcun tipo di ordinamento ma generalmente i record vengono restituiti nell'ordine di inserimento. Se vogliamo che i record siano mostrati in un determinato modo occorre specificarlo usando la clausola ORDER BY.
La clausola ORDER BY
In una query MYSQL la clausola ORDER BY compare sempre come ultima istruzione, dopo qualsiasi altra istruzione MYSQL.
Ecco la sintassi:
SELECT elenco_campi
FROM tabella
WHERE condizioni
ORDER BY elenco_campi [ASC - DESC]
Tipo di ordinamento
Come premesso nel riquadro della sintassi l'ordinamento la clausola ORDER BY ha un parametro che indica il tipo di ordinamento da imporre al resultset: ascendente o discendente. Se il tipo di ordinamento non è espresso, viene usato quello predefinito che è ASC. Per questo motivo quando desideriamo un ordinamento ascendente posiamo anche evitare di indicarlo.
Ordinamento su una o più colonne
Come criterio di ordinamento è possibile indicare una o più colonne.
Se viene indicata una sola solonna, l'ordinamento viene effettuato su quella colonna col tipo di ordinamento scelto.
Se vengono indicate più colonne. In questo caso le righe vengono ordinate prima sulla prima colonna, poi sulla seconda e così via. Per questo motivo è bene porre attenzione alla sequenza con cui vengono indicate le varie colonne.
Per ogni colonna è anche possibile indicare il tipo di ordinamento richiesto: ASC o DESC.
Codice per eseguire le Query
Tutte le Query presentate come esempi sono eseguite da questo script.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<?php include ('res/db_login.php'); if (!$link = mysql_connect($Host, $User, $Password)) { echo mysql_error() . "<br />\n"; } else { if (!mysql_select_db($DBName)) { echo mysql_error() . "<br />\n"; } else { mysql_set_charset("utf8"); if ($result = mysql_query($Query)) { $num_row = mysql_num_rows($result); $numfields = mysql_num_fields($result); $fields = array(); for ($i=0; $i < $numfields; $i++) { $fields[] = mysql_field_name($result, $i); } if ($num_row > 0) { echo $num_row . " record letti<br />\n"; echo "<table class=\"tabella_it\">\n"; echo "<tr>\n"; for ($i=0; $i < $numfields; $i++) { echo "<th>" . $fields[$i] . "</th>\n"; } echo "</tr>\n"; while ($row = mysql_fetch_array($result)) { echo "<tr>\n"; for ($i=0; $i < $numfields; $i++) { echo "<td>"; echo is_null($row[$fields[$i]]) ? 'NULL' : $row[$fields[$i]]; echo "</td>\n"; } echo "</tr>\n"; } echo "</table>\n"; } else { echo "Nessun record restituito<br />\n"; } } else { echo mysql_error() . "<br />\n"; } } } mysql_close ($link);
|
Alcuni esempi
Gli esempi di questa pagina vediamo come lavorare sulla tabella sql_citta.
In questo primo esempio ordiniamo i record sul campo 'citta'.
Il tipo di ordinamento (ASC o DESC) non è espresso, quindi viene preso il tipo predefinito che è ASC.
esempio 1
1
2
3
4
5
6
|
<?php $Query = "SELECT * FROM sql_citta ORDER BY citta "; ?>
|
|
trovati 38 record
15 record visualizzati
id |
cap |
citta |
prov |
1 |
35031 |
AbanoTerme |
PD |
2 |
23821 |
Abbadia Lariana |
LC |
32 |
02011 |
Accumoli |
RI |
24 |
80125 |
Agnano |
NA |
23 |
56017 |
Agnano |
PI |
3 |
56011 |
Agropoli |
GH |
5 |
06031 |
Bevagna |
PG |
36 |
95040 |
Borgo lupo |
CT |
6 |
12011 |
Borgo S. Dalmazzo |
CN |
34 |
98031 |
Capizzi |
ME |
7 |
18037 |
Castel Vittorio |
IM |
25 |
36078 |
Castelvecchio |
VI |
27 |
67020 |
Castelvecchio calvisio |
AQ |
8 |
43050 |
Cereseto |
PR |
9 |
44030 |
Coccanile |
FE |
|
Nell'esempio che segue ordiniamo i record sul campo 'citta' scegliendo il dipo di ordinamento DESC.
esempio 2
1
2
3
4
5
6
|
<?php $Query = "SELECT * FROM sql_citta ORDER BY citta DESC "; ?>
|
|
trovati 38 record
15 record visualizzati
id |
cap |
citta |
prov |
22 |
67010 |
Ville di Fano |
AQ |
21 |
38030 |
Varena |
TN |
20 |
39013 |
Moso in passiria |
BZ |
31 |
80075 |
Monterone |
NA |
37 |
89020 |
Melicucco |
RC |
43 |
40059 |
Medicina |
BO |
19 |
55060 |
Massarosa |
LU |
18 |
58010 |
Marsiliana |
GR |
42 |
30126 |
Malamocco |
VE |
33 |
31037 |
Loria |
TV |
41 |
33020 |
Ligosullo |
UD |
40 |
12040 |
Isola di bene vagienna |
CN |
162 |
29010 |
Godi |
PC |
15 |
17010 |
Giusvalla |
SV |
39 |
81010 |
Gallo matese |
CE |
|
Seguono due esempi nessi affiancati per confrontare il diverso comportamento a seconda del tipo di ordinamento che si da alle colonne.
Nell'esempio 3 e 4 l'ordinamento viene effettuato sulle colonne citta e prov.
Nell'esempio 3 non viene espresso alcun tipo di ordinamento, quindi entrambe le colonne vengono ordinate in modo ASC.
Nell'esempio 4 viene per la colonna citta non viene espresso alcun tipo di ordinamento, quindi viene ordinata nel modo ASC, per la sola colonna prov viene espresso in modo esplicito il modo DESC .
esempio 3
1
2
3
4
5
6
|
<?php $Query = "SELECT * FROM sql_citta ORDER BY citta, prov "; ?>
|
|
trovati 38 record
15 record visualizzati
id |
cap |
citta |
prov |
1 |
35031 |
AbanoTerme |
PD |
2 |
23821 |
Abbadia Lariana |
LC |
32 |
02011 |
Accumoli |
RI |
24 |
80125 |
Agnano |
NA |
23 |
56017 |
Agnano |
PI |
3 |
56011 |
Agropoli |
GH |
5 |
06031 |
Bevagna |
PG |
36 |
95040 |
Borgo lupo |
CT |
6 |
12011 |
Borgo S. Dalmazzo |
CN |
34 |
98031 |
Capizzi |
ME |
7 |
18037 |
Castel Vittorio |
IM |
25 |
36078 |
Castelvecchio |
VI |
27 |
67020 |
Castelvecchio calvisio |
AQ |
8 |
43050 |
Cereseto |
PR |
9 |
44030 |
Coccanile |
FE |
|
|
esempio 4
1
2
3
4
5
6
|
<?php $Query = "SELECT * FROM sql_citta ORDER BY citta, prov DESC "; ?>
|
|
trovati 38 record
15 record visualizzati
id |
cap |
citta |
prov |
1 |
35031 |
AbanoTerme |
PD |
2 |
23821 |
Abbadia Lariana |
LC |
32 |
02011 |
Accumoli |
RI |
23 |
56017 |
Agnano |
PI |
24 |
80125 |
Agnano |
NA |
3 |
56011 |
Agropoli |
GH |
5 |
06031 |
Bevagna |
PG |
36 |
95040 |
Borgo lupo |
CT |
6 |
12011 |
Borgo S. Dalmazzo |
CN |
34 |
98031 |
Capizzi |
ME |
7 |
18037 |
Castel Vittorio |
IM |
25 |
36078 |
Castelvecchio |
VI |
27 |
67020 |
Castelvecchio calvisio |
AQ |
8 |
43050 |
Cereseto |
PR |
9 |
44030 |
Coccanile |
FE |
|
|
Ordinamento casuale con ORDER BY RAND()
Oltre ai metodi visti qui sopre abbiamo anche un altro tipo di orinamento che è quello casuale. Questo serve per esporre un recordset con un ordine casuale.
Ad ogni refresh della pagina l'ordinamento viene cambiato casualmente.
esempio 2
1
2
3
4
5
6
|
<?php $Query = "SELECT * FROM sql_citta ORDER BY RAND() "; ?>
|
|
trovati 38 record
15 record visualizzati
id |
cap |
citta |
prov |
40 |
12040 |
Isola di bene vagienna |
CN |
32 |
02011 |
Accumoli |
RI |
18 |
58010 |
Marsiliana |
GR |
10 |
89030 |
Condofuri |
RC |
19 |
55060 |
Massarosa |
LU |
12 |
60013 |
Corinaldo |
AN |
2 |
23821 |
Abbadia Lariana |
LC |
28 |
21030 |
Cuvio |
VA |
30 |
80070 |
Fusaro |
NA |
5 |
06031 |
Bevagna |
PG |
33 |
31037 |
Loria |
TV |
23 |
56017 |
Agnano |
PI |
25 |
36078 |
Castelvecchio |
VI |
38 |
22010 |
Dosso del liro |
CO |
7 |
18037 |
Castel Vittorio |
IM |
|