Maison >base de données >tutoriel mysql >Comment migrer correctement les requêtes MySQL GROUP BY vers PostgreSQL ?

Comment migrer correctement les requêtes MySQL GROUP BY vers PostgreSQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-11 08:26:40704parcourir

How to Migrate MySQL GROUP BY Queries to PostgreSQL Correctly?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn