Elenchi univoci con DISTINCT

Gli argomenti di questa pagina

  • Codice per eseguire le Query
  • Elenco univoco dei dati con la clausola DISTINCT su un unico campo
  • Nascondere righe duplicate con clausola DISTINCT su molteplici colonne

In una tabella, una colonna può contenere molti valori duplicati, e a volte si desidera avere un elenco univoco dei vari valori.
Per ottenere questo ci viene la clausola DISTINCT che scarta tutti i valori duplicati restituendo solo valori univoci.
La sintassi è:

SELECT DISTINCT colonna_1, colonna_2
FROM tabella;

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);

Partiamo subito con alcuni esempi.

Elenco univoco dei dati con la clausola DISTINCT su un unico campo

Con questo primo esempio vediamo come eliminare, o meglio, nascondere, i dati duplicati restituiti in un resultset.
Poniamo una richiesta:

Mostra l'elenco delle città dei nostri contatti

I nostri contatti li troviamo nella tabella 'rubrica' quindi partiamo con questa semplice Query:

esempio 1
1
2
3
4
<?php
$Query 
"SELECT citta
FROM sql_rubrica"
;
?>
101 record trovati
15 record visualizzati
citta
Varena
Varena
Abbadia Lariana
Ville di Fano
Ville di Fano
Ville di Fano
Ville di Fano
Correzzana
Marsiliana
Abbadia Lariana
Ville di Fano
Ville di Fano
Abbadia Lariana
Falconara Alta
Borgo S. Dalmazzo
...

Dall'esempio appena esegioto vediamo che nell'elenco ci sono numerose città ripetute e questo non è precisamente quel che desideriamo. Perciò possiamo modificare la Query appena vista usando la clausola DISTINCT per eliminare le righe duplicate.

La clausola DISTINCT segue l'istruzione SELECT e precede l'elenco delle colonne da includere nella cluasola.
Iniziamo con una Query dove viene indicata una sola colonna. Questa sintassi implica che nell'elenco vengano selezionati in maniera univoca i valori contenuti nella colonna scelta senza tener conto che il valore mostrato abbia diverse altre proprietà.
Possiamo partire da questo esempio dove possiamo notare che il numero di città viene notevolmente diminuito come si può leggere dai record trovati.

In questi e molti altri esempi vediamo spesso le diciture
record trovati
record visualizzati

Questo per risparmiare spazio nelle pagine
esempio 2
1
2
3
4
<?php
$Query 
"SELECT DISTINCT citta
FROM sql_rubrica"
;
?>
18 record trovati
15 record visualizzati
citta
Varena
Abbadia Lariana
Ville di Fano
Correzzana
Marsiliana
Falconara Alta
Borgo S. Dalmazzo
San Leonardo in Passiria
Cereseto
Coccanile
AbanoTerme
Bevagna
Castel Vittorio
Condofuri
Corinzio
...

Potremmo ritenerci soddisfatti da questo risultato. Tuttavia potrebbe esistere la possibilità che in più Province ci siano città che abbiano lo stesso nome. In questo caso potrebbe succedere che varie città possano essere nascoste.

Nascondere righe duplicate con clausola DISTINCT su molteplici colonne

Aumentando le colonne indicate dopo la clausola DISTINCT si espande la prospettiva in quanto nei dati mostrati viene considerata l'univocità di un valore correlato ad un altro.
Seppur duplicate alcune città, rimane comunque l'univocità nell'accoppiamento di ciascuna città con la propria provincia. Però ne consegue che l'elenco mostrato è ragionevolmente più lungo come è visibile dal numero di record indicato sopra la tabella.

esempio 3
1
2
3
4
<?php
$Query 
"SELECT DISTINCT citta, prov 
FROM sql_rubrica"
;
?>
22 record trovati
15 record visualizzati
citta prov
Varena AE
Abbadia Lariana AB
Ville di Fano RF
Correzzana FS
Marsiliana AB
Falconara Alta FS
Borgo S. Dalmazzo BO
San Leonardo in Passiria RF
Cereseto BO
Coccanile BO
AbanoTerme AT
Bevagna TA
Castel Vittorio CH
Condofuri DO
Condofuri RO
... ...

Contrariamente a quanto detto per l'esempio 3, nel prossimo esempio, anche se aggiungiamo una ulteriore colonna dopo la clausola DISTINCT otteniamo lo stesso numero di record.
Questa non è la regola, ma semplicemente una eccezione perchè è ovvio che per motivi anagrafici un determinato CAP di solito è abbinato alla coppia città - provincia e nella tabella che abbiamo non c'è alcuna città con più CAP.

esempio 4
1
2
3
4
<?php
$Query 
"SELECT DISTINCT citta, prov, cap 
FROM sql_rubrica"
;
?>
22 record trovati
15 record visualizzati
citta prov cap
Varena AE 35031
Abbadia Lariana AB 67030
Ville di Fano RF 51021
Correzzana FS 22050
Marsiliana AB 53021
Falconara Alta FS 22059
Borgo S. Dalmazzo BO 57020
San Leonardo in Passiria RF 51023
Cereseto BO 73020
Coccanile BO 71021
AbanoTerme AT 21049
Bevagna TA 94014
Castel Vittorio CH 89844
Condofuri DO 95022
Condofuri RO 85022
... ... ...

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum