Pertanyaan Cara memilih kumpulan catatan tanggal terbaru dari tabel mysql


Saya menyimpan respons ke berbagai panggilan rpc dalam tabel mysql dengan bidang-bidang berikut:

Table: rpc_responses

timestamp   (date)
method      (varchar)
id          (varchar)
response    (mediumtext)

PRIMARY KEY(timestamp,method,id)

Apa metode terbaik untuk memilih tanggapan terbaru untuk semua kombinasi yang ada method dan id?

  • Untuk setiap tanggal hanya ada satu respons untuk metode / id yang diberikan.

  • Tidak semua kombinasi panggilan harus hadir untuk tanggal tertentu.

  • Ada puluhan metode, ribuan id dan setidaknya 365 tanggal yang berbeda

Contoh data:

timestamp  method  id response
2009-01-10 getThud 16 "....."
2009-01-10 getFoo  12 "....."
2009-01-10 getBar  12 "....."
2009-01-11 getFoo  12 "....."
2009-01-11 getBar  16 "....."

Hasil yang diinginkan:

2009-01-10 getThud 16 "....."
2009-01-10 getBar 12 "....."
2009-01-11 getFoo 12 "....."
2009-01-11 getBar 16 "....."

(Saya tidak berpikir ini adalah pertanyaan yang sama - itu tidak akan memberi saya yang terbaru response)


23
2018-01-12 15:11


asal


Jawaban:


Gunakan solusi ini dengan hati-hati: 
  tidak dijamin untuk bekerja di versi mysql yang akan datang
  tidak diketahui untuk bekerja di mariadb 5.5

Kueri ini dapat berjalan dengan baik, karena tidak ada gabungan.

SELECT * FROM (
    SELECT timestamp, method, id, response
    FROM rpc_responses
    WHERE 1 # some where clause here
    ORDER BY timestamp DESC
) as t1
GROUP BY method

"Kelompok oleh", menciutkan hasil yang ditetapkan pada metode, dan mengembalikan hanya 1 baris per metode, yang paling baru, karena ORDER BY timestamp DESC dalam kueri internal.

FYI, PostgreSQL memiliki cara melakukan ini dibangun ke dalam bahasa:

SELECT DISTINCT ON (method) timestamp, method, id, response
FROM rpc_responses
WHERE 1 # some where clause here
ORDER BY method, timestamp DESC

29
2017-09-27 16:11



Cukup dijawab, tetapi saya tidak yakin itu akan menjadi solusi yang cukup efisien seiring pertumbuhan tabel:

SELECT timestamp,method,id,response FROM rpc_responses 
INNER JOIN
(SELECT max(timestamp),method,id FROM rpc_responses GROUP BY method,id) latest
USING (timestamp,method,id);

13
2018-01-12 15:12



Coba ini...

SELECT o1.id, o1.timestamp, o1.method, o1.response   
FROM rpc_responses o1
WHERE o1.timestamp = ( SELECT max(o2.timestamp)
                       FROM rpc_responses o2
                       WHERE o1.id = o2.id )
ORDER BY o1.timestamp, o1.method, o1.response

... bahkan berfungsi di Access!


5
2017-07-06 11:05



Saya menggunakan ini, bekerja untuk saya

select max(timestamp),method,id from tables where 1 group by method,id order by timestamp desc 

0
2018-05-03 13:32



Subquery sangat berat ketika kumpulan data menjadi lebih besar.

Coba ini:

SELECT t1.* 
FROM rpc_responses AS t1 
INNER JOIN rpc_responses AS t2 
GROUP BY t1.method, t1.id, t1.timestamp
HAVING t1.timestamp=MAX(t2.timestamp)    
ORDER BY t1.timestamp, t1.method, t1.response;

0
2017-07-26 16:40



Konsep "paling baru" cukup samar. Jika Anda berarti sesuatu seperti 100 baris terbaru maka Anda bisa menambahkan TOP(100) untuk Anda SELECT ayat.

Jika yang Anda maksud adalah "paling baru" berdasarkan tanggal yang paling baru maka Anda bisa melakukannya

SELECT timestamp,method,id,response 
FROM rpc_responses
HAVING max(timestamp) = timestamp 

-1
2018-01-12 15:22



... lebih dari satu tahun kemudian, tetapi saya mungkin bisa membantu seseorang Untuk memilih semua pertanyaan mulai dari yang terbaru

SELECT *
FROM rpc_responses
ORDER BY timestamp DESC

-2
2018-06-06 09:25