Jika Anda perlu mendeteksi catatan mana yang mewakili login tanpa catatan logout yang cocok dan sebaliknya, akan sangat membantu jika Anda memperluas tabel Anda dengan ID sesi yang unik. Tambahkan kolom session_id
, hasilkan nilainya saat login, ingat di sesi dan masukkan nilai yang sama ke session_id
untuk kesalahan logout. Ini akan sangat menyederhanakan kueri.
Jika Anda memerlukan kueri yang akan menambahkan catatan login yang hilang, coba yang berikut ini:
SELECT 0 AS idLoginnLog, l1.username, ADDTIME(l1.time, '-0:30:0') AS time, 1 AS type
FROM logs AS l1
LEFT JOIN logs AS l2
ON (l1.username=l2.username AND l2.type=1 AND l2.time BETWEEN ADDTIME(l1.time, '-0:30:0') AND l1.time)
WHERE
l1.type=0
AND l2.idLoginLog IS NULL
(Fiddle
.) Anda dapat menyisipkan hasilnya ke tabel (INSERT INTO logs (...) SELECT ...
) atau tambahkan kueri ke UNION dalam kueri asli Anda.
Seperti yang dicatat oleh @OlivierCoilland, kueri menjadi sangat kompleks dan Anda dapat mempertimbangkan analisis di sisi aplikasi. Karena saya kira tabel log cukup besar, Anda tidak harus mengandalkan Anda akan memasukkan semua entri dalam memori. Anda mungkin memerlukan semacam teknik "jendela geser".
Opsi keempat adalah menghapus catatan logout yang tidak cocok. Solusi saya membutuhkan tabel sementara, jadi saya tidak menempelkan seluruh (cukup panjang) kode di sini, lihat saja biola .