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>
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>
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>
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!