Différences de GROUP BY entre PostgreSQL et MySQL
Il existe des différences dans la syntaxe GROUP BY de MySQL et PostgreSQL, ce qui conduit souvent à des erreurs telles que "La colonne X doit apparaître dans la clause GROUP BY".
Comportement GROUP BY de MySQL
Dans MySQL, la requête suivante renverra une ligne pour chaque valeur unique dans la colonne bookdate :
<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>
Exigences GROUP BY pour PostgreSQL
Cependant, dans PostgreSQL, les colonnes qui ne sont pas explicitement incluses dans la clause GROUP BY ou utilisées dans les fonctions d'agrégation doivent faire partie de la clé primaire. Dans la requête ci-dessus, availables.id n'est ni inclus dans GROUP BY ni utilisé dans l'agrégation, provoquant ainsi l'erreur.
Simuler le comportement de MySQL
Afin de simuler le comportement GROUP BY de MySQL dans PostgreSQL, vous pouvez utiliser DISTINCT ON au lieu de GROUP BY :
<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>
DISTINCT ON garantit l'unicité des colonnes spécifiées tout en préservant l'ordre spécifié dans la clause ORDER BY. Cette syntaxe simule la capacité de MySQL à renvoyer une seule ligne d'enregistrements par une valeur unique dans la colonne bookdate.
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!