Rumah >pangkalan data >tutorial mysql >Bagaimana untuk mendapatkan rekod terakhir dalam setiap kumpulan di MySQL?
mysql: Mengekstrak entri akhir dari setiap kumpulan data
Operasi pangkalan data yang kerap melibatkan pengambilan rekod terbaru dalam setiap kumpulan data. Walaupun sering digunakan, ia boleh membawa kepada isu -isu prestasi. GROUP BY
Pendekatan suboptimal
pertanyaan berikut, menggunakan perintah subquery dan menurun, percubaan ini:
<code class="language-sql">SELECT * FROM (SELECT * FROM messages ORDER BY id DESC) AS x GROUP BY name</code>Kaedah ini tidak cekap kerana pertanyaan luar mengimbas keseluruhan jadual untuk setiap kumpulan, tanpa mengira alternatif yang lebih cekap.
penyelesaian yang dioptimumkan (MySQL 8.0)
MySQL 8.0 dan kemudian versi menawarkan fungsi tetingkap untuk operasi yang lebih baik. dengan cekap mengenal pasti rekod terakhir dalam setiap kumpulan: 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>pertanyaan ini berpangkat setiap baris dalam kumpulannya dan kemudian memilih hanya rekod teratas (terakhir) dari setiap.
alternatif (pra-mysql 8.0)
Untuk versi MySQL yang lebih tua (sebelum 8.0), pendekatan ini sesuai:
<code class="language-sql">SELECT m1.* FROM messages m1 LEFT JOIN messages m2 ON (m1.name = m2.name AND m1.id < m2.id) WHERE m2.id IS NULL;</code>Ini menggunakan
untuk mencari baris tanpa lebih tinggi LEFT JOIN
dalam kumpulan yang sama, dengan berkesan mengasingkan rekod terakhir dalam setiap. id
Pertimbangan Prestasi
Pertanyaan optimum sangat bergantung pada saiz data anda, pengedaran kumpulan, dan indeks yang sedia ada. Penanda aras senario khusus anda adalah penting untuk memilih penyelesaian yang paling berkesan.Atas ialah kandungan terperinci Bagaimana untuk mendapatkan rekod terakhir dalam setiap kumpulan di MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!