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