Pengenalan
Dalam jadual MySQL anda, anda mempunyai data tentang acara kehadiran, dan anda ingin mendapatkan semula kehadiran terakhir yang direkodkan untuk setiap ahli. Walaupun menggunakan klausa GROUP BY, anda menghadapi masalah apabila kehadiran pertama dipilih dan bukannya yang terakhir. Mari kita terokai cara untuk menangani masalah ini.
Menggunakan Subquery dan ORDER BY
Salah satu pendekatan ialah menggunakan subquery dan ORDER BY untuk memilih kehadiran terakhir bagi setiap ahli :
SELECT id_branch_channel, id_member, attendance, timestamp, id_member FROM ( SELECT * FROM view_event_attendance ORDER BY timestamp DESC ) AS t1 WHERE id_event = 782 GROUP BY id_event, id_member;
Pertanyaan ini mendapatkan semula semua baris daripada jadual view_event_attendance, menyusunnya mengikut cap masa dalam tertib menurun (iaitu, terbaharu dahulu), dan kemudian menggunakan subquery sebagai sumber untuk pertanyaan utama. Klausa GROUP BY digunakan untuk mengumpulkan keputusan mengikut ahli dan memilih kehadiran terakhir.
SERTAI dengan Subkueri
Pilihan lain ialah menggunakan JOIN dengan subquery yang mencari cap masa maksimum untuk setiap ahli:
SELECT t1.id_branch_channel, t1.id_member, t1.attendance, t1.timestamp, t1.id_member FROM view_event_attendance AS t1 JOIN ( SELECT id_member, MAX(timestamp) AS max_timestamp FROM view_event_attendance GROUP BY id_member ) AS t2 ON t1.id_member = t2.id_member AND t1.timestamp = t2.max_timestamp WHERE t1.id_event = 782;
Dalam pertanyaan ini, jadual view_event_attendance dialiaskan sebagai t1 dan dicantumkan dengan subkueri (alias sebagai t2) yang mengira cap masa maksimum untuk setiap ahli. Syarat JOIN sepadan dengan baris berdasarkan ID ahli dan cap masa maksimum, memastikan hanya kehadiran terakhir untuk setiap ahli disertakan dalam keputusan.
Menggunakan Pengagregatan Tersuai dan Subrentetan
Penyelesaian yang lebih cekap ialah menggunakan pengagregatan tersuai dan subrentetan bukannya subkueri:
SELECT id_branch_channel, id_member, substring(max(concat(from_unixtime(timestamp), attendance)) from 20) as attendance FROM view_event_attendance WHERE id_event = 782 GROUP BY id_event, id_member;
Pertanyaan ini menggabungkan cap masa dan kehadiran ke dalam rentetan tunggal untuk setiap baris dan menggunakan max() untuk memilih nilai maksimum dalam setiap kumpulan ahli. Fungsi substring() kemudian mengekstrak bahagian kehadiran rentetan bercantum. Pendekatan ini mengelakkan overhed prestasi yang dikaitkan dengan subkueri.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Rekod Kehadiran Terakhir untuk Setiap Ahli dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!