Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gruppieren nach Klausel in mySQL und postgreSQL, warum der Fehler in postgreSQL?

Sie müssen die AGGREGATE FUNCTION verwenden :

Aggregatfunktionen berechnen ein einzelnes Ergebnis aus einer Reihe von Eingabewerten.

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

db<>Fiddle-Demo

MySQL-Behandlung von GROUP BY :

In Standard-SQL kann eine Abfrage, die eine GROUP BY-Klausel enthält, nicht auf nicht aggregierte Spalten in der Auswahlliste verweisen, die nicht in der GROUP BY-Klausel benannt sind

und:

MySQL erweitert die Verwendung von GROUP BY, sodass die Auswahlliste auf nicht aggregierte Spalten verweisen kann, die nicht in der GROUP BY-Klausel genannt werden. Das bedeutet, dass die vorherige Abfrage in MySQL zulässig ist. Sie können diese Funktion verwenden, um eine bessere Leistung zu erzielen, indem Sie unnötiges Sortieren und Gruppieren von Spalten vermeiden. Dies ist jedoch vor allem dann nützlich, wenn alle Werte in jeder nicht aggregierten Spalte, die nicht in GROUP BY benannt sind, für jede Gruppe gleich sind. Dem Server steht es frei, einen beliebigen Wert aus jeder Gruppe auszuwählen. Wenn sie also nicht gleich sind, sind die gewählten Werte unbestimmt

Bei einer MySQL-Version ohne explizite Aggregatfunktion können Sie also mit undetermininistischen Werten enden. Ich empfehle dringend, eine bestimmte Aggregatfunktion zu verwenden.

BEARBEITEN:

Von MySQL-Behandlung von GROUP BY :

SQL92 und frühere Versionen erlauben keine Abfragen, für die die Auswahlliste, die HAVING-Bedingung oder die ORDER BY-Liste auf nicht aggregierte Spalten verweisen, die nicht in der GROUP BY-Klausel benannt sind.

SQL99 und höher erlaubt solche Nicht-Aggregate per optionalem Feature T301 wenn sie funktional von GROUP BY-Spalten abhängig sind: Wenn eine solche Beziehung zwischen Name und Custid besteht, ist die Abfrage zulässig. Dies wäre beispielsweise der Fall, wenn ein Primärschlüssel von Kunden verwahrt wird.

Beispiel:

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;