Mysql
 sql >> Database >  >> RDS >> Mysql

Raggruppa per clausola in MySQL e PostgreSQL, perché l'errore in PostgreSQL?

Devi usare FUNZIONE AGGREGA :

Le funzioni aggregate calcolano un singolo risultato da un insieme di valori di input.

SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table 
GROUP BY col2;

db<>demo violino

Gestione MySQL di GROUP BY :

Nell'SQL standard, una query che include una clausola GROUP BY non può fare riferimento a colonne non aggregate nell'elenco di selezione che non sono denominate nella clausola GROUP BY

e:

MySQL estende l'uso di GROUP BY in modo che l'elenco di selezione possa fare riferimento a colonne non aggregate non nominate nella clausola GROUP BY. Ciò significa che la query precedente è legale in MySQL. È possibile utilizzare questa funzione per ottenere prestazioni migliori evitando l'ordinamento e il raggruppamento delle colonne non necessari. Tuttavia, ciò è utile principalmente quando tutti i valori in ogni colonna non aggregata non denominata in GROUP BY sono gli stessi per ogni gruppo. Il server è libero di scegliere qualsiasi valore da ciascun gruppo, quindi, a meno che non siano gli stessi, i valori scelti sono indeterminati

Quindi con la versione MySQL senza funzione di aggregazione esplicita potresti ritrovarti con valori non deterministici. Consiglio vivamente di utilizzare una specifica funzione di aggregazione.

MODIFICA:

Da Gestione MySQL di GROUP BY :

SQL92 e versioni precedenti non consentono query per le quali l'elenco di selezione, la condizione HAVING o l'elenco ORDER BY fanno riferimento a colonne non aggregate che non sono denominate nella clausola GROUP BY.

SQL99 e versioni successive consentono tali non aggregati per funzionalità facoltativa T301 se sono funzionalmente dipendenti dalle colonne GROUP BY: Se esiste una tale relazione tra nome e custid, la query è legale. Questo sarebbe il caso, ad esempio, se fosse custodita una chiave primaria dei clienti.

Esempio:

SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o
JOIN customers AS c
  ON o.custid = c.custid
GROUP BY o.custid;