PostgreSQL et MySQL : une comparaison de clause GROUP BY
La migration des requêtes MySQL vers PostgreSQL peut conduire à l'erreur "la colonne 'XYZ' doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation." Cet écart provient de la manière dont ces bases de données gèrent les clauses GROUP BY
.
L'approche non standard de MySQL
L'implémentation GROUP BY
de MySQL s'écarte du standard SQL. Il permet de sélectionner des colonnes non explicitement répertoriées dans la clause GROUP BY
, ce qui entraîne une sortie imprévisible. La ligne sélectionnée dans chaque groupe est déterminée implicitement, influencée par des facteurs tels que l'indexation et l'optimisation des requêtes.
Conforme aux normes PostgreSQL GROUP BY
PostgreSQL, cependant, adhère strictement au standard SQL. Toutes les colonnes de la liste SELECT
doivent soit être incluses dans la clause GROUP BY
, soit faire partie d'une fonction d'agrégation (comme SUM
, AVG
, COUNT
). Sinon, l'erreur susmentionnée se produit.
Réplication du comportement de MySQL dans PostgreSQL
Bien que l'approche de PostgreSQL soit plus prévisible et conforme aux normes, vous pouvez simuler le comportement non standard de MySQL en utilisant DISTINCT ON
. La requête PostgreSQL suivante le démontre :
<code class="language-sql">SELECT DISTINCT ON (availables.bookdate) availables.*, rooms.hotel_id FROM availables INNER JOIN rooms ON rooms.id = availables.room_id WHERE rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24' ORDER BY availables.updated_at;</code>
DISTINCT ON
renvoie une seule ligne pour chaque valeur distincte dans availables.bookdate
, en conservant l'ordre des lignes spécifié par la clause ORDER BY
. Cela imite efficacement le comportement GROUP BY
non standard de MySQL dans ce scénario spécifique. Notez que cette approche s'appuie sur la clause ORDER BY
pour définir quelle ligne est choisie pour chaque groupe distinct.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!