Back-ticks jsou nestandardní MySQL věc. K uvozovkám identifikátorů použijte kanonické dvojité uvozovky (možné i v MySQL). To znamená, že pokud se vaše tabulka ve skutečnosti jmenuje "MY_TABLE"
(všechna velká písmena). Pokud jste to (moudřeji) pojmenovali my_table
(všechna malá písmena), pak můžete odstranit dvojité uvozovky nebo použít malá písmena.
Také používám ct
místo count
jako alias, protože je špatné používat názvy funkcí jako identifikátory.
Jednoduchý případ
To by fungovalo s PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Vyžaduje to sloupce primárního klíče v GROUP BY
doložka. Výsledky jsou identické na dotaz MySQL, ale ct
bude vždy 1 (nebo 0, pokud id IS NULL
) - zbytečné hledat duplikáty.
Seskupit podle sloupců jiného než primárního klíče
Pokud chcete seskupit podle jiných sloupců, věci se zkomplikují. Tento dotaz napodobuje chování vašeho dotazu MySQL – a vy to můžete použijte *
.
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;
Funguje to, protože DISTINCT ON
(specifické pro PostgreSQL), například DISTINCT
(SQL-Standard), jsou aplikovány po funkce okna count(*) OVER (...)
. Funkce okna
(se znakem OVER
klauzule) vyžadují PostgreSQL 8.4 nebo novější a nejsou dostupné v MySQL.
Funguje s jakoukoli tabulkou bez ohledu na primární nebo jedinečná omezení.
1
v DISTINCT ON
a ORDER BY
je jen zkratka odkazující na pořadové číslo položky v SELECT
seznam.
SQL Fiddle demonstrovat obě vedle sebe.
Více podrobností v této úzce související odpovědi:
count(*)
vs. count(id)
Pokud hledáte duplikáty, je lepší použít count(*)
než pomocí count(id)
. Pokud id
, existuje nepatrný rozdíl může být NULL
, protože NULL
hodnoty se nepočítají – zatímco count(*)
počítá všechny řádky. Pokud id
je definováno NOT NULL
, výsledky jsou stejné, ale count(*)
je obecně vhodnější (a také o něco rychlejší).