Как выбрать самый последний набор датированных записей из таблицы mysql
Я сохраняю ответ на различные вызовы rpc в таблице mysql со следующими полями:
Table: rpc_responses
timestamp (date)
method (varchar)
id (varchar)
response (mediumtext)
PRIMARY KEY(timestamp,method,id)
Каков наилучший метод выбора последних ответов для всех существующих комбинаций method
и id
?
-
Для каждой даты может быть только один ответ для данного метода /id.
-
Не все комбинации вызовов обязательно присутствуют на заданную дату.
-
Есть десятки методов, тысячи идентификаторов и не менее 365 разных дат
Пример данных:
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 "....."
Желаемый результат:
2009-01-10 getThud 16 "....."
2009-01-10 getBar 12 "....."
2009-01-11 getFoo 12 "....."
2009-01-11 getBar 16 "....."
(Я не думаю, что это - тот же вопрос - он не даст мне последнее response
)
Ответы
Ответ 1
Я ответил, но я не уверен, что это будет достаточно эффективное решение по мере роста таблицы:
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);
Ответ 2
Используйте это решение с осторожностью:
не гарантируется работа в будущих версиях mysql
он не работает в mariadb 5.5
Этот запрос может работать хорошо, потому что нет объединений.
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
"group by", сворачивает набор результатов по методу и возвращает только 1 строку для каждого метода, самый последний, из-за временной метки ORDER BY DESC во внутреннем запросе.
FYI, PostgreSQL имеет способ сделать это встроенным в язык:
SELECT DISTINCT ON (method) timestamp, method, id, response
FROM rpc_responses
WHERE 1 # some where clause here
ORDER BY method, timestamp DESC
Ответ 3
Попробуйте это...
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
... он даже работает в Access!
Ответ 4
Подзапрос очень облагается налогом, когда набор данных становится больше.
Попробуйте следующее:
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;
Ответ 5
Я использовал это, работал у меня
select max(timestamp),method,id from tables where 1 group by method,id order by timestamp desc
Ответ 6
Понятие "самое последнее" довольно расплывчато. Если вы имеете в виду что-то вроде 100 самых последних строк, вы можете просто добавить TOP(100)
к вашему предложению SELECT
.
Если вы имеете в виду "самое последнее", основанное на самой последней дате, вы можете просто сделать
SELECT timestamp,method,id,response
FROM rpc_responses
HAVING max(timestamp) = timestamp
Ответ 7
... более года спустя, но я могу помочь кому-то
Чтобы выбрать все запросы, начиная с последних
SELECT *
FROM rpc_responses
ORDER BY timestamp DESC