Back-ticks zijn een niet-standaard MySQL-ding. Gebruik de canonieke dubbele aanhalingstekens om identifiers aan te halen (ook mogelijk in MySQL). Dat wil zeggen, als uw tabel in feite de naam "MY_TABLE" heeft (allemaal hoofdletters). Als je het (verstandiger) noemde my_table (allemaal kleine letters), dan kunt u de dubbele aanhalingstekens verwijderen of kleine letters gebruiken.
Ik gebruik ook ct in plaats van count als alias, omdat het een slechte gewoonte is om functienamen als identifiers te gebruiken.
Eenvoudig geval
Dit zou werken met PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Het vereist primaire sleutelkolom(men) in de GROUP BY clausule. De resultaten zijn identiek naar een MySQL-query, maar ct zou altijd 1 zijn (of 0 als id IS NULL ) - nutteloos om duplicaten te vinden.
Groepeer op andere dan primaire sleutelkolommen
Als u op andere kolom(men) wilt groeperen, wordt het ingewikkelder. Deze query bootst het gedrag van uw MySQL-query na - en u kunt gebruik * .
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;
Dit werkt omdat DISTINCT ON (PostgreSQL-specifiek), zoals DISTINCT (SQL-standaard), worden na . toegepast de vensterfunctie count(*) OVER (...) . Vensterfuncties
(met de OVER clausule) vereisen PostgreSQL 8.4 of later en zijn niet beschikbaar in MySQL.
Werkt met elke tabel, ongeacht primaire of unieke beperkingen.
De 1 in DISTINCT ON en ORDER BY is slechts een afkorting om te verwijzen naar het volgnummer van het item in de SELECT lijst.
SQL Fiddle om beide naast elkaar te demonstreren.
Meer details in dit nauw verwante antwoord:
count(*) vs. count(id)
Als u op zoek bent naar duplicaten, bent u beter af met count(*) dan met count(id) . Er is een subtiel verschil als id kan NULL zijn , omdat NULL waarden worden niet geteld - terwijl count(*) telt alle rijen. Als id is gedefinieerd NOT NULL , resultaten zijn hetzelfde, maar count(*) is over het algemeen geschikter (en ook iets sneller).