PostgreSQL与MySQL的GROUP BY差异
MySQL和PostgreSQL的GROUP BY语法存在差异,这常常导致错误,例如“列X必须出现在GROUP BY子句中”。
MySQL的GROUP BY行为
在MySQL中,以下查询将为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>
PostgreSQL的GROUP BY要求
然而,在PostgreSQL中,未明确包含在GROUP BY子句中或未用于聚合函数的列必须是主键的一部分。在上面的查询中,availables.id既未包含在GROUP BY中,也未用于聚合,因此导致错误。
模拟MySQL的行为
为了在PostgreSQL中模拟MySQL的GROUP BY行为,可以使用DISTINCT ON代替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确保指定列的唯一性,同时保留ORDER BY子句中指定的顺序。此语法模拟了MySQL按bookdate列唯一值返回单行记录的能力。
以上是PostgreSQL vs. MySQL GROUP BY:如何在 PostgreSQL 中实现 MySQL 的分组行为?的详细内容。更多信息请关注PHP中文网其他相关文章!