首頁 > 資料庫 > mysql教程 > 如何正確將MySQL GROUP BY查詢遷移到PostgreSQL?

如何正確將MySQL GROUP BY查詢遷移到PostgreSQL?

Patricia Arquette
發布: 2025-01-11 08:26:40
原創
653 人瀏覽過

How to Migrate MySQL GROUP BY Queries to PostgreSQL Correctly?

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_atORDER BY 子句中,這樣 DISTINCT ON 就能永遠選擇同一行。 如果沒有這個,DISTINCT ON 可能會在每次執行時傳回不同的行。

以上是如何正確將MySQL GROUP BY查詢遷移到PostgreSQL?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板