MySQL で PostgreSQL の SELECT DISTINCT ON 機能をレプリケートするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-10 15:49:02
オリジナル
732 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート