Pesan Rekod mengikut Tarikh dan Masa Sebelum Dikumpul dalam MySQL
Apabila berurusan dengan jadual yang mengandungi cap masa, adalah penting untuk mendapatkan maklumat berdasarkan jangka masa tertentu. Walau bagaimanapun, mengisih mengikut tarikh dan masa sebelum mengumpulkan rekod mengikut medan tertentu boleh menimbulkan cabaran dalam MySQL.
Pertimbangkan jadual berikut:
name date time tom | 2011-07-04 | 01:09:52 tom | 2011-07-04 | 01:09:52 mad | 2011-07-04 | 02:10:53 mad | 2009-06-03 | 00:01:01
Untuk mendapatkan semula rekod tertua yang dikumpulkan mengikut nama, pertanyaan berikut akan gagal:
SELECT * ORDER BY date ASC, time ASC GROUP BY name
Pertanyaan ini tidak berfungsi kerana GROUP BY mesti berlaku sebelum ORDER BY. Walau bagaimanapun, pengumpulan sebelum mengisih menyebabkan rekod "gila" yang lebih baharu dikembalikan dahulu berbanding rekod yang lebih lama.
Untuk mengatasi isu ini, terdapat beberapa pendekatan yang tersedia:
Pendekatan Subkueri :
SELECT * FROM ( SELECT * FROM table_name ORDER BY date ASC, time ASC ) AS sub GROUP BY name
Kaedah ini mencipta subkueri yang mengisih rekod mengikut tarikh dan masa, kemudian menghantar keputusan kepada pertanyaan luar untuk mengumpulkan mengikut nama. Memandangkan GROUP BY beroperasi pada rekod padanan pertama dalam subkueri, ia mendapatkan semula rekod tertua untuk setiap nama.
ROW_NUMBER() Pendekatan:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date, time) AS row_num FROM table_name ) AS sub WHERE row_num = 1
ROW_NUMBER( ) memberikan nombor berjujukan kepada setiap baris dalam setiap partition nama, diisih mengikut tarikh dan masa. Dengan memilih hanya rekod dengan row_num = 1, rekod tertua untuk setiap nama dipilih.
MAX() Subquery Approach:
SELECT * FROM table_name WHERE (date, time) IN ( SELECT MAX(date) AS date, MAX(time) AS time FROM table_name GROUP BY name )
Pertanyaan ini menggunakan subquery untuk memilih tarikh dan masa maksimum bagi setiap nama. Dengan menapis pertanyaan utama berdasarkan nilai ini, ia mendapatkan semula rekod tertua untuk setiap nama.
Atas ialah kandungan terperinci Bagaimana untuk Mengisih Rekod mengikut Tarikh dan Masa Sebelum Dikumpulkan dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!