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

Patricia Arquette
Lepaskan: 2024-10-30 06:24:28
asal
591 orang telah melayarinya

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
Salin selepas log masuk

Untuk mendapatkan semula rekod tertua yang dikumpulkan mengikut nama, pertanyaan berikut akan gagal:

SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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
)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!