Mysql
 sql >> Base de données >  >> RDS >> Mysql

Group by clause dans mySQL et postgreSQL, pourquoi l'erreur dans postgreSQL ?

Vous devez utiliser AGREGATE FUNCTION :

Les fonctions d'agrégation calculent un seul résultat à partir d'un ensemble de valeurs d'entrée.

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

db<>démo violon

Gestion MySQL de GROUP BY :

En SQL standard, une requête qui inclut une clause GROUP BY ne peut pas faire référence à des colonnes non agrégées dans la liste de sélection qui ne sont pas nommées dans la clause GROUP BY

et :

MySQL étend l'utilisation de GROUP BY afin que la liste de sélection puisse faire référence à des colonnes non agrégées non nommées dans la clause GROUP BY. Cela signifie que la requête précédente est légale dans MySQL. Vous pouvez utiliser cette fonctionnalité pour obtenir de meilleures performances en évitant le tri et le regroupement inutiles des colonnes. Toutefois, cela est principalement utile lorsque toutes les valeurs de chaque colonne non agrégée non nommée dans GROUP BY sont les mêmes pour chaque groupe. Le serveur est libre de choisir n'importe quelle valeur de chaque groupe, donc à moins qu'elles ne soient identiques, les valeurs choisies sont indéterminées

Ainsi, avec la version de MySQL sans fonction d'agrégation explicite, vous pouvez vous retrouver avec des valeurs indéterministes. Je suggère fortement d'utiliser une fonction d'agrégation spécifique.

MODIF :

De Gestion MySQL de GROUP BY :

SQL92 et les versions antérieures n'autorisent pas les requêtes pour lesquelles la liste de sélection, la condition HAVING ou la liste ORDER BY font référence à des colonnes non agrégées qui ne sont pas nommées dans la clause GROUP BY.

SQL99 et versions ultérieures autorisent de tels non-agrégats par fonctionnalité facultative T301 s'ils dépendent fonctionnellement des colonnes GROUP BY : Si une telle relation existe entre le nom et le custid, la requête est légale. Ce serait le cas, par exemple, si l'on gardait une clé primaire de clients.

Exemple :

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;