ホームページ >データベース >mysql チュートリアル >MySQL で ROW_NUMBER() 機能を実現するにはどうすればよいですか?
MySQL で ROW_NUMBER() 関数をシミュレートします
SQL Server の ROW_NUMBER() 関数は、特定のパーティション内の行に連続番号を割り当てることができます。 MySQL にはまったく同等の機能はありませんが、同様の機能を実現する方法はあります。
変数を使用して行番号付けを実装する
8.0 より前の MySQL バージョンでは、変数を使用してパーティション内の行番号を増やすことができます。次のクエリは、このアプローチを示しています:
<code class="language-sql">SELECT t.*, @rownum := @rownum + 1 AS rank FROM YOUR_TABLE t, (SELECT @rownum := 0) r</code>
このクエリは各行に連続番号を割り当て、@rownum 変数は各行でインクリメントされます。
複数のパーティションの処理
パーティションに複数の列が含まれている場合は、複数の変数を作成し、パーティション列の 1 つの値が変更されたときにそれを 0 に設定できます。たとえば、col1 とcol2 でパーティション化します:
<code class="language-sql">SELECT t.*, @rownum_col1 := IF(@col1 = t.col1, @rownum_col1 + 1, 1) AS rank_col1, @rownum_col2 := IF(@col2 = t.col2, @rownum_col2 + 1, 1) AS rank_col2, @col1 := t.col1, @col2 := t.col2 FROM YOUR_TABLE t, (SELECT @rownum_col1 := 0, @rownum_col2 := 0, @col1 := '', @col2 := '') r ORDER BY t.col1, t.col2;</code>
注: MySQL 8.0 以降のバージョンでは ROW_NUMBER() 関数がネイティブにサポートされており、行番号付けをより直接的に実装できます。 上記のコードは、複数のパーティションの場合を正しく処理し、パーティションが変更されたときに行番号カウンターがリセットされるように修正されました。 変数割り当ての順序はデータ読み取りの順序に依存するため、一貫した結果を保証するために ORDER BY
句が追加されました。 IF
ステートメントも、ロジックをより明確に表現するために調整されました。
以上がMySQL で ROW_NUMBER() 機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。