Les back-ticks sont une chose MySQL non standard. Utilisez les guillemets doubles canoniques pour citer les identifiants (possible également dans MySQL). Autrement dit, si votre table s'appelle en fait "MY_TABLE"
(tout en majuscule). Si vous l'avez (plus judicieusement) nommée my_table
(tous en minuscules), vous pouvez supprimer les guillemets doubles ou utiliser des minuscules.
Aussi, j'utilise ct
au lieu de count
comme alias, car il est déconseillé d'utiliser des noms de fonction comme identifiants.
Cas simple
Cela fonctionnerait avec PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Il nécessite une ou plusieurs colonnes de clé primaire dans le GROUP BY
clause. Les résultats sont identiques à une requête MySQL, mais ct
serait toujours 1 (ou 0 si id IS NULL
) - inutile de trouver des doublons.
Regrouper par autre que les colonnes de clé primaire
Si vous souhaitez regrouper par d'autres colonnes, les choses se compliquent. Cette requête imite le comportement de votre requête MySQL - et vous pouvez utilisez *
.
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;
Cela fonctionne car DISTINCT ON
(spécifique à PostgreSQL), comme DISTINCT
(SQL-Standard), sont appliqués après la fonction de fenêtre count(*) OVER (...)
. Fonctions de fenêtre
(avec le OVER
clause) nécessite PostgreSQL 8.4 ou version ultérieure et ne sont pas disponibles dans MySQL.
Fonctionne avec n'importe quelle table, quelles que soient les contraintes primaires ou uniques.
Le 1
dans DISTINCT ON
et ORDER BY
est juste un raccourci pour faire référence au numéro ordinal de l'élément dans le SELECT
liste.
SQL Fiddle pour démontrer les deux côte à côte.
Plus de détails dans cette réponse étroitement liée :
count(*)
vs count(id)
Si vous recherchez des doublons, vous feriez mieux d'utiliser count(*)
qu'avec count(id)
. Il y a une différence subtile si id
peut être NULL
, car NULL
les valeurs ne sont pas comptées - tandis que count(*)
compte toutes les lignes. Si id
est défini NOT NULL
, les résultats sont les mêmes, mais count(*)
est généralement plus approprié (et légèrement plus rapide aussi).