Différences entre l'instruction GROUP BY entre PostgreSQL et MySQL
Présentation
Lors de la migration de requêtes de MySQL vers PostgreSQL, vous rencontrez souvent des erreurs lors de l'utilisation de la clause GROUP BY. Cet article plongera dans les différences entre GROUP BY dans MySQL et PostgreSQL et fournira des moyens de résoudre cette erreur.
Erreur
Lors de l'exécution de la requête suivante dans PostgreSQL :
<code class="language-sql">SELECT `availables`.* 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') GROUP BY availables.bookdate ORDER BY availables.updated_at</code>
PostgreSQL peut renvoyer l'erreur suivante :
<code>ERROR: column "availables.id" must appear in the GROUP BY clause or be used in an aggregate function</code>
Différence
Dans MySQL, la clause GROUP BY permet d'inclure certains champs non agrégés dans les résultats de requête. Cependant, PostgreSQL suit la norme SQL et exige que tous les champs non agrégés apparaissent dans une clause GROUP BY ou soient utilisés dans des fonctions d'agrégation.
Solution : DISTINCT SUR
Pour simuler le comportement GROUP BY de MySQL dans PostgreSQL, nous pouvons utiliser l'expression DISTINCT ON. DISTINCT ON nous permet de sélectionner une ligne unique par groupe en fonction de la colonne spécifiée. Dans l'exemple donné, la requête suivante fonctionnera dans PostgreSQL :
<code class="language-sql">SELECT DISTINCT ON (availables.bookdate) `availables`.* 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.bookdate, availables.updated_at</code>
Cette requête renverra la ième ligne pour chaque valeur unique de availables.bookdate, simulant efficacement le comportement GROUP BY de MySQL. Notez que pour garantir des résultats cohérents, nous avons ajouté availables.updated_at
à la clause ORDER BY
afin que DISTINCT ON
sélectionne toujours la même ligne. Sans cela, DISTINCT ON
peut renvoyer des lignes différentes à chaque exécution.
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!