Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Masa Daftar Masuk/Keluar Terkini untuk Setiap Pengguna dalam Pangkalan Data?

Bagaimana untuk Mendapatkan Masa Daftar Masuk/Keluar Terkini untuk Setiap Pengguna dalam Pangkalan Data?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-13 12:46:44378semak imbas

How to Retrieve the Most Recent Check-in/Out Time for Each User in a Database?

Mengekstrak Masa Daftar Masuk/Daftar Keluar Terkini bagi setiap Pengguna

Pernyataan Masalah:

Tugasnya ialah untuk mencipta paparan pangkalan data yang memaparkan masa daftar masuk/daftar keluar terkini setiap pengguna, termasuk status "masuk" atau "keluar" yang sepadan daripada jadual lms_attendance.

Pendekatan Awal dan Hadnya:

Percubaan awal digunakan GROUP BY pada kedua-dua pengguna dan status "masuk/keluar" (io lajur). Pendekatan ini gagal mengendalikan senario di mana pengguna mempunyai berbilang rekod dengan cap masa maksimum yang sama, menyebabkan entri pendua untuk pengguna tersebut. Pertanyaan yang cacat ialah:

<code class="language-sql">select 
    `lms_attendance`.`id` AS `id`,
    `lms_attendance`.`user` AS `user`,
    max(`lms_attendance`.`time`) AS `time`,
    `lms_attendance`.`io` AS `io` 
from `lms_attendance` 
group by 
    `lms_attendance`.`user`, 
    `lms_attendance`.`io`</code>

Penyelesaian Berkesan:

Dua penyelesaian dibentangkan untuk menangani isu ini:

Penyelesaian 1: Mengendalikan Berbilang Masa Maksimum:

Pertanyaan ini mengembalikan semua baris yang mewakili cap masa terkini untuk setiap pengguna, walaupun berbilang rekod berkongsi masa maksimum yang sama:

<code class="language-sql">SELECT t1.*
FROM lms_attendance t1
WHERE t1.time = (SELECT MAX(t2.time)
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user)</code>

Penyelesaian 2: Menjamin Satu Baris bagi setiap Pengguna:

Jika hanya satu rekod bagi setiap pengguna diperlukan, tanpa mengira kemungkinan masa maksimum pendua, pertanyaan ini adalah lebih baik. Ia memilih rekod dengan ID tertinggi (dengan andaian id kenaikan automatik, mencerminkan entri terbaharu):

<code class="language-sql">SELECT t1.*
FROM lms_attendance t1
WHERE t1.id = (SELECT t2.id
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user            
                 ORDER BY t2.time DESC, t2.id DESC
                 LIMIT 1)</code>

Pertanyaan yang disemak ini menggunakan ORDER BY t2.time DESC, t2.id DESC untuk mengutamakan masa terkini dan kemudian ID tertinggi sekiranya berlaku pertalian, memastikan hasil tunggal yang muktamad bagi setiap pengguna.

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Masa Daftar Masuk/Keluar Terkini untuk Setiap Pengguna dalam Pangkalan Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn