Mysql
 sql >> Base de données >  >> RDS >> Mysql

Équivalent PostgreSQL pour MySQL GROUP BY

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).