首頁  >  文章  >  資料庫  >  如何在 MySQL 中複製 PostgreSQL 的 SELECT DISTINCT ON 功能?

如何在 MySQL 中複製 PostgreSQL 的 SELECT DISTINCT ON 功能?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-10 15:49:02723瀏覽

How to Replicate PostgreSQL's SELECT DISTINCT ON Functionality in MySQL?

POSTGRESQL 到 MYSQL:轉換 SELECT DISTINCT ON 查詢

導航資料庫遷移可能具有挑戰性,尤其是從 PostgreSQL 轉換到 MygreSQL 時。一個常見的查詢建構 SELECT DISTINCT ON 引發了對其 MySQL 對應項的疑問。

Postgresql SELECT DISTINCT ON

在PostgreSQL 中,SELECT DISTINCT ON 允許消除重複項基於指定表達式(col1、col2、col3)的行,同時保留每一個指定表達式個唯一集的「第一」行。例如,如果表格包含重複行:

col1 | col2 | col3 | col4 | col5
--------------------------------
1 | 2 | 3 | 777 | 888
1 | 2 | 3 | 888 | 999
3 | 3 | 3 | 555 | 555

查詢SELECT DISTINCT ON (col1, col2, col3) col4, col5 FROM tablename 將會傳回:

col4 | col5
-----------
777 | 888
555 | 555

選擇如果不指定ORDER BY 子句,「第一」行的值是不可預測的。

MySQL 擴充GROUP BY

MySQL 擴充了 GROUP BY 的使用,允許選擇未在 GROUP BY 子句中明確命名的非聚合列。然而,伺服器從每個群組中選擇的值是任意的,導致查詢輸出中出現不可預測的值。

轉換為 MySQL

MySQL 缺乏與PostgreSQL SELECT DISTINCT ON 建構。模擬其功能的一種方法是透過 GROUP BY 的 MySQL 擴充:

SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3

此查詢將為每個 (col1, col2, col3) 集傳回「第一」行,類似於 PostgreSQL 查詢。但是,由於缺少 order by 子句,傳回的行仍然不確定。

可以透過修改查詢來實現更精確地選擇「第一」行:

SELECT t1.col4, t1.col5
FROM tablename t1 INNER JOIN (SELECT col1, col2, col3, MIN(col4) as m_col4
                              FROM tablename
                              GROUP BY col1, col2, col3) s
     ON t1.col1=s.col1
        AND t1.col2=s.col2
        AND t1.col3=s.col3
        AND t1.col4=s.m_col4
GROUP BY
  t1.col1, t1.col2, t1.col3, t1.col4

這查詢有效地檢索每個唯一表達式集(col1、col2、col3)的col4 最小值的行,從而提供更可預測的結果輸出。

結論

將 PostgreSQL 查詢轉換為 MySQL 對應項需要具體情況分析。雖然確切的等價物可能並不總是存在,但各種策略和解決方法提供了解決方案,從相對簡單到中等複雜,具體取決於查詢的性質。

以上是如何在 MySQL 中複製 PostgreSQL 的 SELECT DISTINCT ON 功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn