PostgreSQL 和 MySQL:GROUP BY 子句比较
将 MySQL 查询迁移到 PostgreSQL 可能会导致错误“列 'XYZ' 必须出现在 GROUP BY 子句中或在聚合函数中使用”。这种差异源于这些数据库处理 GROUP BY
子句的方式。
MySQL 的非标准方法
MySQL 的 GROUP BY
实现偏离了 SQL 标准。 它允许选择 GROUP BY
子句中未明确列出的列,从而导致不可预测的输出。 从每组中选择的行是隐式确定的,受索引和查询优化等因素的影响。
PostgreSQL 符合标准GROUP BY
然而,PostgreSQL 严格遵守 SQL 标准。 SELECT
列表中的所有列必须包含在 GROUP BY
子句中或者是聚合函数的一部分(如 SUM
、AVG
、COUNT
)。 否则会出现上述错误。
在 PostgreSQL 中复制 MySQL 的行为
虽然 PostgreSQL 的方法更具可预测性且符合标准,但您可以使用 DISTINCT ON
模拟 MySQL 的非标准行为。以下 PostgreSQL 查询演示了这一点:
<code class="language-sql">SELECT DISTINCT ON (availables.bookdate) availables.*, rooms.hotel_id 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.updated_at;</code>
DISTINCT ON
为 availables.bookdate
中的每个不同值返回一行,保持 ORDER BY
子句指定的行顺序。 这有效地模仿了 MySQL 在这个特定场景中的非标准 GROUP BY
行为。 请注意,此方法依赖于 ORDER BY
子句来定义为每个不同组选择哪一行。
以上是为什么我的 MySQL GROUP BY 查询在 PostgreSQL 中失败?的详细内容。更多信息请关注PHP中文网其他相关文章!