ホームページ >データベース >mysql チュートリアル >MySQL で Postgresql の DISTINCT ON の機能を実現するにはどうすればよいですか?

MySQL で Postgresql の DISTINCT ON の機能を実現するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-10 22:56:03231ブラウズ

How to Achieve the Functionality of Postgresql's DISTINCT ON in MySQL?

Postgresql の DISTINCT ON クエリを MySQL に変換する

Postgresql から MySQL に移行するには、多くの場合、既存のクエリを適応させる必要があります。このようなクエリ タイプの 1 つは DISTINCT ON クエリで、複数の列を考慮しながら一意の行を取得します。 MySQL にはまったく同等の機能がありませんが、同様の機能を実現するアプローチはあります。

Postgresql の SELECT DISTINCT ON

Postgresql の SELECT DISTINCT ON クエリは、指定された列に基づいて個別の行を取得します。例:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename

このクエリは、(col1、col2、col3) の一意の組み合わせごとに 1 行だけを返し、最初に検出されたcol4 およびcol5 の値を保持します。

MySQL のGroup By Extension

MySQL は GROUP BY 句を拡張して、非集計カラムの選択を可能にします。ただし、各グループに対して返される特定の行は不定です。これは、

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

のようなクエリは、行選択という点では Postgresql の DISTINCT ON クエリと同等であることを意味します。ただし、返される行は予測可能ではありません。

MySQL への適応

予測可能性を確保するには、秩序あるアプローチが必要です。 ORDER BY でサブクエリを使用する魅力にもかかわらず、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

このクエリは、DISTINCT ON を満たす最初の行を検索します。 Postgresql の基準は、相関サブクエリを使用して各グループの最小の Col4 値を取得します。

結論

一方、Postgresql の DISTINCT ON クエリには MySQL に直接対応するクエリがありません。 、回避策があります。アプローチの選択は、特定のクエリと必要な複雑さのレベルによって異なります。

以上がMySQL で Postgresql の DISTINCT ON の機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。