Tylne kleszcze to niestandardowa rzecz MySQL. Użyj kanonicznych podwójnych cudzysłowów do cytowania identyfikatorów (możliwe również w MySQL). To znaczy, jeśli w rzeczywistości Twoja tabela nosi nazwę "MY_TABLE"
(wszystkie wielkie litery). Jeśli (bardziej mądrze) nazwałeś go my_table
(wszystkie małe litery), możesz usunąć podwójne cudzysłowy lub użyć małych liter.
Ponadto używam ct
zamiast count
jako alias, ponieważ używanie nazw funkcji jako identyfikatorów jest złą praktyką.
Prosty przypadek
To działałoby z PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Wymaga kolumn klucza podstawowego w GROUP BY
klauzula. Wyniki są identyczne do zapytania MySQL, ale ct
zawsze będzie wynosić 1 (lub 0, jeśli id IS NULL
) - bezużyteczne, aby znaleźć duplikaty.
Grupuj według kolumn innych niż klucz podstawowy
Jeśli chcesz pogrupować według innych kolumn, sprawy się komplikują. To zapytanie naśladuje zachowanie zapytania MySQL – i możesz użyj *
.
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;
Działa to, ponieważ DISTINCT ON
(specyficzne dla PostgreSQL), jak DISTINCT
(SQL-Standard), są stosowane po funkcja okna count(*) OVER (...)
. Funkcje okien
(z OVER
klauzula) wymagają PostgreSQL 8.4 lub nowsze i nie są dostępne w MySQL.
Działa z każdą tabelą, niezależnie od podstawowych lub unikalnych ograniczeń.
1
w DISTINCT ON
i ORDER BY
jest po prostu skrótem odnoszącym się do numeru porządkowego elementu w SELECT
lista.
Skrzypce SQL aby zademonstrować obie strony obok siebie.
Więcej szczegółów w tej ściśle powiązanej odpowiedzi:
count(*)
a count(id)
Jeśli szukasz duplikatów, lepiej skorzystaj z count(*)
niż z count(id)
. Istnieje subtelna różnica, jeśli id
może być NULL
, ponieważ NULL
wartości nie są liczone - podczas gdy count(*)
liczy wszystkie wiersze. Jeśli id
jest zdefiniowany NOT NULL
, wyniki są takie same, ale count(*)
jest ogólnie bardziej odpowiedni (i nieco szybszy).