次の表を考えてみましょう を使用した基本的なグループクエリは、次の結果が生成されます。
ただし、予想される出力は各グループの最新レコードです。
messages
solution
Id | Name | Other_Columns |
---|---|---|
1 | A | A_data_1 |
2 | A | A_data_2 |
3 | A | A_data_3 |
4 | B | B_data_1 |
5 | B | B_data_2 |
6 | C | C_data_1 |
ウィンドウ関数(MySQL 8.0以降)を使用してくださいSELECT * FROM messages GROUP BY NameMySQL 8.0は、各グループの最後の記録を見つけるためのエレガントなソリューションを提供するために、ウィンドウ関数を導入しました。次のクエリでは、この目的を達成するために関数を使用します:
Id | Name | Other_Columns |
---|---|---|
1 | A | A_data_1 |
4 | B | B_data_1 |
6 | C | C_data_1 |
を使用することです。
パフォーマンスと適用性両方のソリューションは非常に効率的ですが、そのパフォーマンスはデータの規模と分布によって異なる場合があります。大規模で多様なデータセットの場合、通常、ウィンドウ関数法が推奨されます。
データが特定のモード(各グループの記録が比較的少ないなど)を提示する場合、メソッドがより効率的になる場合があります。 ベンチマークテスト メソッドはテクノロジーのグループ化よりも優れていることが証明されています。たとえば、何百万回もの行を持つ大きなデータベースでは、メソッドの実行時間は1秒未満であり、グループ化テクノロジーには1分以上かかります。
ただし、最適な方法を決定するために、特定のデータセットでこれら2つのソリューションをテストすることを常にお勧めします。
:
Id
Name
Other_Columns
3
A
A_data_3
5
B
B_data_2
6
C
C_data_1
ROW_NUMBER()
<code class="language-sql">WITH ranked_messages AS (
SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn
FROM messages AS m
)
SELECT * FROM ranked_messages WHERE rn = 1;</code>
以上がMySQLの各グループの最後のレコードを効率的に見つける方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。