Tutorial su Mysql->Sub-query
Sub-query
Una subquery è una query situata all'interno di una interrogazione.
Se una query restituisce una tabella, essa può sostituire una tabella in una interrogazione,
se invece restituisce un valore allora può sostituire un campo.
Per vedere alcuni esempi, prendiamo in esame le seguenti tabelle
Tabella cliente
| id | | ragione | | | 1 | | Bricolage | | | 2 | | Il paradiso della brucola | | | 3 | | Da Mario | | | 4 | | Da Paolo | | | 5 | | XYZ | | | 6 | | Colori | |
Tabella articolo
| id | | descrizione | | scorta_fisica | | scorta_sicurezza | | id_categoria | | | 1 | | Articolo 2B1 | | 0 | | 15 | | 2 | | | 2 | | Articolo 1A1 | | 0 | | 5 | | 1 | | | 3 | | Articolo 2B2 | | 2 | | 10 | | 2 | | | 4 | | Articolo 3C1 | | 4 | | 5 | | 3 | | | 5 | | Articolo 3C2 | | 0 | | 5 | | 3 | | | 6 | | Articolo 2B3 | | 0 | | 8 | | 2 | |
Tabella categoria_merciologica
| id | | nome | | | 1 | | Categoria A | | | 2 | | Categoria B | | | 3 | | Categoria C | |
Tabella ordine_cliente_dettaglio
| id | | id_ordine | | rigo | | id_articolo | | qta_ordinata | | qta_evasa | | prezzo | | | 1 | | 1 | | 1 | | 1 | | 1 | | 1 | | 15 | | | 2 | | 1 | | 2 | | 2 | | 2 | | 2 | | 15 | | | 3 | | 2 | | 1 | | 3 | | 1 | | 1 | | 15 | | | 4 | | 3 | | 1 | | 1 | | 2 | | 2 | | 15 | | | 5 | | 4 | | 1 | | 4 | | 1 | | 1 | | 16 | | | 6 | | 4 | | 2 | | 5 | | 1 | | 0 | | 20 | | | 7 | | 5 | | 1 | | 2 | | 1 | | 1 | | 15 | | | 8 | | 5 | | 2 | | 1 | | 2 | | 1 | | 15 | | | 9 | | 5 | | 3 | | 6 | | 2 | | 0 | | 12 | | | 10 | | 6 | | 1 | | 5 | | 2 | | 0 | | 20 | | | 11 | | 7 | | 1 | | 5 | | 1 | | 0 | | 20 | | | 12 | | 8 | | 1 | | 4 | | 1 | | 1 | | 16 | | | 13 | | 8 | | 2 | | 1 | | 1 | | 0 | | 15 | | | 14 | | 9 | | 1 | | 2 | | 2 | | 1 | | 15 | | | 15 | | 10 | | 1 | | 6 | | 1 | | 0 | | 12 | | | 16 | | 10 | | 2 | | 2 | | 2 | | 1 | | 15 | |
Tabella ordine_cliente
| id | | data_ordine | | id_cliente | | nr_ordine | | | 1 | | 14/01/2008 | | 1 | | 1 | | | 2 | | 14/01/2008 | | 3 | | 2 | | | 3 | | 15/01/2008 | | 3 | | 3 | | | 4 | | 15/01/2008 | | 4 | | 4 | | | 5 | | 16/01/2008 | | 5 | | 5 | | | 6 | | 16/01/2008 | | 6 | | 6 | | | 7 | | 16/01/2008 | | 1 | | 7 | | | 8 | | 17/01/2008 | | 2 | | 8 | | | 9 | | 18/01/2008 | | 3 | | 9 | | | 10 | | 18/01/2008 | | 4 | | 10 | |
Partiamo con query semplice: totale importo ordinato per cliente
Volendo riscrivere la query precedente utilizzando le subquery, otteniamo:
In entrambi i casi abbiamo il seguente risultato
| Cliente | | Totale | | | Bricolage | | 45 | | | Il paradiso della brucola | | 20 | | | Da Mario | | 76 | | | Da Paolo | | 66 | | | XYZ | | 69 | | | Colori | | 28 | |
Applicando lo schema visto in precedenza proviamo a scrivere una query che calcoli:
- Totale importo ordinato;
- Totale importo evaso (si intende la valutazione delle merce consegnata);
- Totale importo da evadere (si intende la valutazione delle merce da consegnare);
- Varietà della tipologia di articoli (ovvero quanti articoli diversi);
- Categoria merciologica più richiesta (intesa come quantità di pezzi ordinati).
Vediamo come calcolare separatamente ogni query
Iniziamo con il totale ordinato, evaso e da evadere
La prissima query può essere usata per calcolare la varietà degli articoli e la categoria merciologia più richiesta
Di seguito la varietà degli articoli
In questo altro esempio vediamo che la SubQuery è stata inserita in una colonna
Possiamo vedere un esempio di implementazione in codice PHP per richiamare la query
Di seguito il risultato della query
| Cliente | | Ordinato | | Evaso | | Da evadere | | Varietà | | Categoria | | | Bricolage | | 45 | | 45 | | 0 | | 2 | | Categoria A | | | Il paradiso della brucola | | 20 | | 0 | | 20 | | 1 | | Categoria C | | | Da Mario | | 76 | | 61 | | 15 | | 3 | | Categoria B | | | Da Paolo | | 66 | | | | | | 3 | | Categoria A | | | XYZ | | 69 | | 30 | | 39 | | 3 | | Categoria B | | | Colori | | 28 | | | | | | 1 | | Categoria C | |
Riepilogo