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