Kembalikan Baris Terakhir Setiap Kumpulan dalam MySQL Dengan Berkesan
Mengembalikan baris terakhir setiap kumpulan dalam MySQL selalunya diperlukan untuk manipulasi data. Pertanyaan yang diberikan dalam gesaan:
select * from foo as a where a.id = (select max(id) from foo where uid = a.uid group by uid) group by uid;
mencapai ini dengan melakukan pertanyaan bersarang untuk mencari ID maksimum bagi setiap UID unik, kemudian memilih hanya baris dengan ID yang sepadan.
Pendekatan Lebih Cekap
Walau bagaimanapun, pertanyaan yang lebih cekap boleh digunakan untuk menghapuskan pertanyaan bersarang:
SELECT t1.* FROM foo t1 JOIN ( SELECT uid, MAX(id) AS max_id FROM foo GROUP BY uid ) t2 ON t1.id = t2.max_id;
Pertanyaan ini menggunakan operasi JOIN untuk memadankan secara langsung dengan maksimum ID untuk setiap UID, memberikan prestasi yang lebih baik berbanding pendekatan pertanyaan bersarang.
Pertimbangan Pengoptimuman Tambahan
Untuk pengoptimuman lanjut, EXPLAIN boleh digunakan untuk menganalisis pelan pertanyaan dan mengenal pasti sebarang kemungkinan kesesakan. Selain itu, indeks pada lajur UID boleh meningkatkan prestasi pertanyaan dengan ketara.
Pendekatan Alternatif
Pilihan lain ialah menggunakan fungsi LAG():
SELECT t1.* FROM foo t1 LEFT JOIN foo t2 ON t1.id < t2.id AND t1.uid = t2.uid WHERE t2.id is NULL;
Pertanyaan ini menggunakan fungsi LAG() untuk mengenal pasti baris seterusnya dalam kumpulan. Jika tiada baris berikutnya (iaitu, baris semasa adalah yang terakhir dalam kumpulannya), pertanyaan akan mengembalikan baris semasa. Walaupun pendekatan ini boleh cekap, pendekatan ini mungkin tidak selalunya berprestasi seperti pertanyaan berasaskan JOIN yang dibincangkan di atas.
Atas ialah kandungan terperinci Bagaimana untuk Mengembalikan Baris Terakhir Setiap Kumpulan dengan Cekap dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!