POSTGRESQL から MYSQL: SELECT DISTINCT ON クエリの変換
データベースの移行は、特に PostgreSQL から MySQL に移行する場合に困難になることがあります。一般的なクエリ構造の 1 つである 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 を指定しない限り、「最初の」行の内容は予測できません
GROUP BY への MySQL 拡張
MySQL は GROUP BY の使用を拡張し、GROUP BY 句で明示的に指定されていない非集計カラムの選択を可能にします。 。ただし、各グループからのサーバーの値の選択は任意であり、その結果、クエリ出力に予測不可能な値が含まれます。
MySQL への変換
MySQL には、 PostgreSQL の SELECT DISTINCT ON 構造。その機能をエミュレートする 1 つのアプローチは、MySQL の GROUP BY 拡張機能を使用することです:
SELECT col4, col5 FROM tablename GROUP BY col1, col2, col3
このクエリは、PostgreSQL クエリと同様に、各 (col1、col2、col3) セットの「最初の」行を返します。ただし、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 中国語 Web サイトの他の関連記事を参照してください。