PostgreSQL から MySQL への DISTINCT ON クエリの変換
PostgreSQL から MySQL への移行において、ユーザーは、クエリを削除するための構文の違いに遭遇する可能性があります。特定の列値に基づいて行を複製します。 PostgreSQL は SELECT DISTINCT ON ステートメントを使用しますが、MySQL は GROUP BY 句の拡張を使用します。
PostgreSQL の SELECT DISTINCT ON
SELECT DISTINCT ON (col1,col2, Col3) PostgreSQL のクエリは、指定された列の一意の組み合わせごとに最初の条件を満たす行を保持します。たとえば、次のテーブルについて考えてみましょう:
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 はどちらも (col1、col2、col3) の組み合わせごとに 1 行を返しますが、返される特定の行は、明示的な順序付けがないため異なる場合があります。
順序付きクエリの回避策
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 中国語 Web サイトの他の関連記事を参照してください。