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
Libérer: 2025-01-11 08:26:40
original
653 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal