Back-ticks är en icke-standard MySQL-grej. Använd de kanoniska dubbla citattecken för att citera identifierare (möjligt även i MySQL). Det vill säga om din tabell faktiskt heter "MY_TABLE"
(alla versaler). Om du (mer klokare) döpte den till my_table
(alla gemener), då kan du ta bort de dubbla citattecken eller använda gemener.
Jag använder också ct
istället för count
som alias, eftersom det är dålig praxis att använda funktionsnamn som identifierare.
Enkelt fall
Detta skulle fungera med PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Den kräver primärnyckelkolumn(er) i GROUP BY
klausul. Resultaten är identiska till en MySQL-fråga, men ct
skulle alltid vara 1 (eller 0 om id IS NULL
) - onödigt att hitta dubbletter.
Gruppera efter andra kolumner än primärnyckelkolumner
Om du vill gruppera efter andra kolumner blir saker och ting mer komplicerade. Den här frågan efterliknar beteendet hos din MySQL-fråga - och du kan använd *
.
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;
Detta fungerar eftersom DISTINCT ON
(PostgreSQL-specifik), som DISTINCT
(SQL-standard), tillämpas efter fönsterfunktionen count(*) OVER (...)
. Fönsterfunktioner
(med OVER
klausul) kräver PostgreSQL 8.4 eller senare och är inte tillgängliga i MySQL.
Fungerar med alla tabeller, oavsett primära eller unika begränsningar.
1
i DISTINCT ON
och ORDER BY
är bara en förkortning för att referera till artikelns ordningsnummer i SELECT
lista.
SQL Fiddle för att visa båda sida vid sida.
Mer information i detta närbesläktade svar:
count(*)
kontra count(id)
Om du letar efter dubbletter är du bättre med count(*)
än med count(id)
. Det finns en subtil skillnad om id
kan vara NULL
, eftersom NULL
värden räknas inte - medan count(*)
räknar alla rader. Om id
är definierad NOT NULL
, resultaten är desamma, men count(*)
är i allmänhet mer lämpligt (och lite snabbare också).