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).