PostgreSQL 與 MySQL 的 GROUP BY 語句差異
引言
將查詢從 MySQL 移轉到 PostgreSQL 時,使用 GROUP BY 子句時常會遇到錯誤。本文將深入探討 MySQL 和 PostgreSQL 中 GROUP BY 的區別,並提供解決此錯誤的方法。
錯誤
在 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 可能會回傳以下錯誤:
<code>ERROR: column "availables.id" must appear in the GROUP BY clause or be used in an aggregate function</code>
區別
在 MySQL 中,GROUP BY 子句允許在查詢結果中包含某些非聚合欄位。但是,PostgreSQL 遵循 SQL 標準,要求所有非聚合欄位必須出現在 GROUP BY 子句中或用在聚合函數中。
解:DISTINCT ON
為了在 PostgreSQL 中模擬 MySQL 的 GROUP BY 行為,我們可以使用 DISTINCT ON 表達式。 DISTINCT ON 允許我們根據指定的列為每個群組選擇唯一的一行。在給定的範例中,以下查詢將在 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>
此查詢將傳回每個 availables.bookdate 唯一值的第 一行,有效地模擬了 MySQL 的 GROUP BY 行為。 注意,為了確保結果的一致性,我們加入了 availables.updated_at
到 ORDER BY
子句中,這樣 DISTINCT ON
就能永遠選擇同一行。 如果沒有這個,DISTINCT ON
可能會在每次執行時傳回不同的行。
以上是如何正確將MySQL GROUP BY查詢遷移到PostgreSQL?的詳細內容。更多資訊請關注PHP中文網其他相關文章!