Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Mengisih Rekod mengikut Tarikh dan Masa Sebelum Dikumpulkan dalam MySQL?

Bagaimana untuk Mengisih Rekod mengikut Tarikh dan Masa Sebelum Dikumpulkan dalam MySQL?

Patricia Arquette
Patricia Arquetteasal
2024-10-30 06:24:28593semak imbas

How to Sort Records by Date and Time Before Grouping in MySQL?

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!

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