Como selecionar o conjunto mais recente de registros datados de uma tabela mysql

Eu estou armazenando a resposta para várias chamadas de rpc em uma tabela mysql com os seguintes campos:

Table: rpc_responses timestamp (date) method (varchar) id (varchar) response (mediumtext) PRIMARY KEY(timestamp,method,id) 

Qual é o melhor método de selecionar as respostas mais recentes para todas as combinações existentes de method e id ?

Dados de amostra:

 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 "....." 

Resultado desejado:

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

(Eu não acho que esta é a mesma pergunta – não vai me dar a response mais recente)

Use esta solução com caucanvas:
não é garantido que funcione em futuras versões do mysql
não é conhecido por trabalhar em mariadb 5.5

Isso pode consultar pode executar bem, porque não há associações.

 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 

O “agrupar por”, recolhe o conjunto de resultados no método e retorna apenas 1 linha por método, a mais recente, por causa do registro de data e hora ORDER BY DESC na consulta interna.

FYI, o PostgreSQL tem uma maneira de fazer isso embutido na linguagem:

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

Eu mesmo respondi, mas não tenho certeza de que será uma solução eficiente o suficiente conforme a tabela cresce:

 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); 

Tente isso …

 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 

… até funciona no Access!

eu usei isso, funcionou para mim

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

A subconsulta é muito desgastante quando o dataset se torna maior.

Tente isto:

 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; 

O conceito de “mais recente” é bastante vago. Se você quer dizer algo como as 100 linhas mais recentes, você pode simplesmente adicionar um TOP(100) à sua cláusula SELECT .

Se você quer dizer o “mais recente” baseado em uma data mais recente, então você pode apenas fazer

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

… é mais do que um ano depois, mas eu posso ajudar alguém Para selecionar todas as consultas a partir do mais recente

 SELECT * FROM rpc_responses ORDER BY timestamp DESC