將DISTINCT ON 查詢從PostgreSQL 轉換為MySQL
在從PostgreSQL 轉換為MySQL 的過程中,使用者可能會遇到消除語法上的差異是基於特定列值的重複行。 PostgreSQL 使用 SELECT DISTINCT ON 語句,而 MySQL 使用 GROUP BY 子句的擴充。
PostgreSQL 的SELECT DISTINCT ON
SELECT DISTINCT ON (col1, col2, PostgreSQL 中的col3) 查詢為指定列的唯一組合保留第一個符合每個唯一組合條件的行。例如,考慮下表:
col1 | col2 | col3 | col4 | col5 |
---|---|---|---|---|
1 | 2 | 3 | 777 | 888 |
1 | 2 | 3 | 888 | 999 |
3 | 3 | 3 | 555 | 555 |
查詢將輸出:
col4 | col5 |
---|---|
777 | 888 |
555 | 555 |
MySQL 對GROUP BY 的擴充
MySQL 的擴充允許選擇非聚合列,即使它們未包含在GROUP BY 子句中。但是,伺服器可以自由地為每個群組從這些欄位中選擇任意值。
等效MySQL 查詢
PostgreSQL 範例的等效MySQL 查詢是:
SELECT col4, col5 FROM tablename GROUP BY col1, col2, col3;
PostgreSQL 和MySQL 都會為每個(colSQL col2, col3)組合會傳回一行,但由於缺乏明確的排序,傳回的具體行可能會有所不同。
有序查詢的解決方法
為了模仿PostgreSQL 的有序DISTINCT ON 行為,需要在MySQL 中進行更複雜的查詢:
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;
結論
雖然MySQL沒有與 Postgresql 的 SELECT DISTINCT ON 完全對應的功能,但涉及 GROUP BY 擴展的解決方法可以提供類似的功能。解決方法的複雜性可能會根據查詢要求而有所不同。
以上是如何將 PostgreSQL 的 SELECT DISTINCT ON 查詢轉換為 MySQL?的詳細內容。更多資訊請關注PHP中文網其他相關文章!