Обратните отметки са нещо нестандартно за MySQL. Използвайте каноничните двойни кавички, за да цитирате идентификатори (възможно и в MySQL). Тоест, ако вашата таблица всъщност се казва "MY_TABLE"
(всички главни букви). Ако сте го нарекли (по-разумно) my_table
(всички малки букви), тогава можете да премахнете двойните кавички или да използвате малки букви.
Също така използвам ct
вместо count
като псевдоним, защото е лоша практика да се използват имена на функции като идентификатори.
Прост случай
Това ще работи с PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Изисква колона(и) с първичен ключ в GROUP BY
клауза. Резултатите са идентични към MySQL заявка, но ct
винаги ще бъде 1 (или 0, ако id IS NULL
) - безполезно за намиране на дубликати.
Групиране по колони, различни от първичен ключ
Ако искате да групирате по други колони, нещата стават по-сложни. Тази заявка имитира поведението на вашата MySQL заявка - и вие можете използвайте *
.
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;
Това работи, защото DISTINCT ON
(специфичен за PostgreSQL), като DISTINCT
(SQL-Standard), се прилагат след функцията на прозореца count(*) OVER (...)
. Прозоречни функции
(с OVER
клауза) изискват PostgreSQL 8.4 или по-нова версия и не са налични в MySQL.
Работи с всяка таблица, независимо от първични или уникални ограничения.
1
в DISTINCT ON
и ORDER BY
е просто съкращаване за позоваване на поредния номер на елемента в SELECT
списък.
SQL Fiddle за да демонстрирате и двете едно до друго.
Повече подробности в този тясно свързан отговор:
count(*)
спрямо count(id)
Ако търсите дубликати, по-добре е с count(*)
отколкото с count(id)
. Има фина разлика, ако id
може да бъде NULL
, защото NULL
стойностите не се отчитат - докато count(*)
брои всички редове. Ако id
е дефиниран NOT NULL
, резултатите са същите, но count(*)
като цяло е по-подходящо (и малко по-бързо).