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:

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:

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:

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:

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: 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:

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.