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

PostgreSQL-Äquivalent für MySQL GROUP BY

Backticks sind eine Nicht-Standard-MySQL-Sache. Verwenden Sie die kanonischen doppelten Anführungszeichen, um Bezeichner zu zitieren (auch in MySQL möglich). Das heißt, wenn Ihre Tabelle tatsächlich "MY_TABLE" heißt (alles in Großbuchstaben). Wenn Sie es (klüger) my_table nennen (alles Kleinbuchstaben), dann können Sie die doppelten Anführungszeichen entfernen oder Kleinbuchstaben verwenden.

Außerdem verwende ich ct statt count als Alias, weil es schlechte Praxis ist, Funktionsnamen als Bezeichner zu verwenden.

Einfacher Fall

Dies würde mit PostgreSQL 9.1 funktionieren :

SELECT *, count(id) ct
FROM   my_table
GROUP  BY primary_key_column(s)
ORDER  BY ct DESC;

Es erfordert Primärschlüsselspalte(n) im GROUP BY Klausel. Die Ergebnisse sind identisch zu einer MySQL-Abfrage, aber ct wäre immer 1 (oder 0 wenn id IS NULL ist). ) - nutzlos, um Duplikate zu finden.

Gruppieren nach anderen als Primärschlüsselspalten

Wenn Sie nach anderen Spalten gruppieren möchten, wird es komplizierter. Diese Abfrage ahmt das Verhalten Ihrer MySQL-Abfrage nach – und Sie können Verwenden Sie * .

SELECT DISTINCT ON (1, some_column)
       count(*) OVER (PARTITION BY some_column) AS ct
      ,*
FROM   my_table
ORDER  BY 1 DESC, some_column, id, col1;

Das funktioniert, weil DISTINCT ON (PostgreSQL-spezifisch), wie DISTINCT (SQL-Standard), werden nach angewendet die Fensterfunktion count(*) OVER (...) . Fensterfunktionen (mit dem OVER -Klausel) erfordern PostgreSQL 8.4 oder höher und sind in MySQL nicht verfügbar.

Funktioniert mit jeder Tabelle, unabhängig von primären oder eindeutigen Einschränkungen.

Die 1 in DISTINCT ON und ORDER BY ist nur eine Abkürzung, um sich auf die Ordnungszahl des Elements in SELECT zu beziehen Liste.

SQL-Geige um beides nebeneinander zu demonstrieren.

Weitere Details in dieser eng verwandten Antwort:

count(*) vs. count(id)

Wer nach Duplikaten sucht, ist mit count(*) besser bedient als mit count(id) . Es gibt einen kleinen Unterschied zwischen id kann NULL sein , weil NULL Werte werden nicht gezählt - während count(*) zählt alle Zeilen. Wenn id ist NOT NULL definiert , die Ergebnisse sind die gleichen, aber count(*) ist im Allgemeinen besser geeignet (und auch etwas schneller).