MySQL selezionare la riga con il valore massimo in una colonna

In questo articolo, esamineremo come selezionare la riga con il valore massimo in una colonna utilizzando LEFT JOIN e MAX().

Molte volte, abbiamo bisogno di ottenere le righe che hanno il valore massimo in una colonna. Ci possono essere requisiti diversi intorno allo stesso quesito, e quindi ci sono varie soluzioni.

MySQL selezionare la riga con il valore massimo in una colonna: funzione MAX()

Partiamo dalla creazione della tabella vendite su cui andremo a lavorare:

CREATE TABLE vendite (
    id_utente INT,
    nome_utente VARCHAR(255),
    commissioni_percentuali INT,
    prodotti_venduti INT,
    totale_commissioni INT
);
# Insert the records
INSERT INTO vendite (id_utente,nome_utente,commissioni_percentuali,prodotti_venduti,totale_commissioni) 
VALUES(1,"Francesco",10,200,2000);

INSERT INTO vendite (id_utente,nome_utente,commissioni_percentuali,prodotti_venduti,totale_commissioni) 
VALUES(2,"Marco",5,300,1500);

INSERT INTO vendite (id_utente,nome_utente,commissioni_percentuali,prodotti_venduti,totale_commissioni) 
VALUES(3,"Matteo",10,250,2500);

INSERT INTO vendite (id_utente,nome_utente,commissioni_percentuali,prodotti_venduti,totale_commissioni) 
VALUES(4,"Riccardo",25,150,3750);

INSERT INTO vendite (id_utente,nome_utente,commissioni_percentuali,prodotti_venduti,totale_commissioni) 
VALUES(5,"Alessandro",20,350,7000);

INSERT INTO vendite (id_utente,nome_utente,commissioni_percentuali,prodotti_venduti,totale_commissioni) 
VALUES(6,"Mattia",25,355,8750);

INSERT INTO vendite (id_utente,nome_utente,commissioni_percentuali,prodotti_venduti,totale_commissioni) 
VALUES(7,"Antonio",35,355,8750);

Se ora stampiamo la tabella tramite:

SELECT * FROM vendite;

Otteniamo:

MySQL selezionare la riga con il valore massimo in una colonna

Ricavare il nome utente, la percentuale di commissioni e il numero di prodotti venduti del venditore che ha venduto il maggior numero di prodotti.

Di seguito è riportato il codice per raggiungere i risultati richiesti:

SELECT 
    nome_utente, commissioni_percentuali, prodotti_venduti
FROM
    vendite
WHERE
    prodotti_venduti = (SELECT MAX(prodotti_venduti)
								        FROM vendite)
LIMIT 1;

Risultato:

MySQL selezionare la riga con il valore massimo in una colonna

Abbiamo ottenuto ciò che cercavamo.

Analiziamo per punti la query:

Subquery

SELECT MAX(prodotti_venduti)
FROM vendite

Un principiante potebbe pensare che basti aggiungere i campi nome_utente e commissioni_percentuali a questa select per ottenere lo stesso risultato, ma non è così.

Il MAX(prodotti_venduti) sarà corretto, ma il resto dei campi verrebbero presi dal primo record trovato, nel nostro caso:

MySQL selezionare la riga con il valore massimo in una colonna

La query appena riportata ci serve solo per ottenere il singolo valore massimo della colonna prodotti_venduti.

Select

SELECT 
    nome_utente, commissioni_percentuali, prodotti_venduti
FROM
    vendite
WHERE
    prodotti_venduti = (SELECT MAX(prodotti_venduti)
								        FROM vendite)

Con questa select stampiamo tutte le righe aventi come valore massimo nel campo prodotti venduti.

Risultato:

MySQL selezionare la riga con il valore massimo in una colonna

Limit

LIMIT 1

Grazie a limit 1 riusciamo ad ottenere solo il primo risultato della select.

Order By

Per essere più precisi, magari vorremo avere l’utente che ha venduto più prodotti e in caso di più dipendenti, quello con le commissioni percentuali più alte, allora potremo usare ORDER BY

SELECT 
    nome_utente, commissioni_percentuali, prodotti_venduti
FROM
    vendite
WHERE
    prodotti_venduti = (SELECT MAX(prodotti_venduti)
								        FROM vendite)
ORDER BY DESC
LIMIT 1;

Risultato:

MySQL selezionare la riga con il valore massimo in una colonna

MySQL selezionare la riga con il valore massimo in una colonna: LEFT JOIN

Un altro approccio per ottenere la riga con il valore massimo in una particolare colonna è utilizzare i left join.

SELECT 
    v1.nome_utente, v1.commissioni_percentuali , v1.prodotti_venduti
FROM
    vendite v1
        LEFT JOIN
    vendite v2 ON v1.prodotti_venduti< v2.prodotti_venduti
WHERE
    v2.nome_utente IS NULL
ORDER BY v1.commissioni_percentuali DESC
LIMIT 1;

Ottenendo lo stesso identico risultato.

Analiziamo per punti la query:

Left Join

Se non sapete cosè il left join https://www.w3schools.com/sql/sql_join_left.asp

La parola chiave LEFT JOIN restituisce tutti i record dalla tabella di sinistra (Table1) e i record corrispondenti dalla tabella di destra (Table2). Il risultato è 0 record dal lato destro, se non c’è corrispondenza.

SELECT 
    v1.nome_utente,v2.nome_utente as 'v2.nome_utente', v1.commissioni_percentuali , v1.prodotti_venduti
FROM
    vendite v1
        LEFT JOIN
    vendite v2 ON v1.prodotti_venduti< v2.prodotti_venduti

Risultato:

MySQL selezionare la riga con il valore massimo in una colonna

Questo join agisce sulla tabella stessa, cercando “manualmente” le righe con i prodotti venduti più grandi.

Come vedete, le righe con il numero prodotti venduti maggiore avrà il v2.nome_utente NULL

Where

WHERE v2.nome_utente IS NULL

Selezionando solo gli utenti con nome utente NULL, otteniamo proprio le righe con prodotti_venduti maggiori

Per qualsiasi informazione o incomprensione non esitate a scrivere un commento o a contattarci.

Lascia un commento