Как выбрать самый последний набор датированных записей из таблицы MySQL
98140 просмотра
7 ответа
Я храню ответ на различные вызовы rpc в таблице mysql со следующими полями:
Table: rpc_responses
timestamp (date)
method (varchar)
id (varchar)
response (mediumtext)
PRIMARY KEY(timestamp,method,id)
Каков наилучший метод выбора самых последних ответов для всех существующих комбинаций method
и 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
)
Ответы (7)
28 плюса
Используйте это решение с осторожностью:
в будущих версиях 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 строку для каждого метода, самую последнюю из-за временной метки DESC ORDER BY во внутреннем запросе.
К вашему сведению, PostgreSQL имеет способ сделать это встроенным в язык:
SELECT DISTINCT ON (method) timestamp, method, id, response
FROM rpc_responses
WHERE 1 # some where clause here
ORDER BY method, timestamp DESC
Автор: velcrow
Размещён: 27.09.2012 04:11
14 плюса
Сам ответил, но я не уверен, что это будет достаточно эффективное решение по мере роста таблицы:
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);
Автор: Ken
Размещён: 12.01.2009 03:12
6 плюса
Попробуй это...
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!
Автор: versek Размещён: 06.07.2010 11:050 плюса
я использовал это, работал на меня
select max(timestamp),method,id from tables where 1 group by method,id order by timestamp desc
Автор: charles
Размещён: 03.05.2012 01:32
0 плюса
Подзапрос очень обременителен, когда набор данных становится больше.
Попробуй это:
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;
Автор: Simon
Размещён: 26.07.2011 04:40
-1 плюса
Понятие «самый последний» довольно расплывчато. Если вы имеете в виду что-то вроде 100 самых последних строк, то вы можете просто добавить TOP(100)
к своему SELECT
предложению.
Если вы имеете в виду «самый последний» на основе самой последней даты, то вы можете просто сделать
SELECT timestamp,method,id,response
FROM rpc_responses
HAVING max(timestamp) = timestamp
Автор: Neil
Размещён: 12.01.2009 03:22
-2 плюса
... прошло больше года, но я мог бы помочь кому-то выбрать все запросы, начиная с последней
SELECT *
FROM rpc_responses
ORDER BY timestamp DESC
Автор: spi
Размещён: 06.06.2010 09:25
Вопросы из категории :
- mysql Двоичные данные в MySQL
- mysql Насколько большой может быть база данных MySQL до того, как производительность начнет снижаться
- mysql Выбрать все столбцы, кроме одного в MySQL?
- mysql MySQL или PDO - каковы плюсы и минусы?
- mysql Как выбрать n-ую строку в таблице базы данных SQL?
- sql Проверить наличие изменений в таблице SQL Server?
- sql Обменять уникальные индексированные значения столбцов в базе данных
- sql Как работает индексация базы данных?
- sql Как индексировать столбец базы данных
- sql Как разбить строку, чтобы я мог получить доступ к элементу x?
- date Как получить разницу между двумя датами в JavaScript?
- date Получить последний день месяца в Python
- date DateTime.Now против DateTime.UtcNow
- date Получить последнюю пятницу месяца в Java
- date Why does Javascript getYear() return 108?
- greatest-n-per-group Извлечь строку, которая имеет значение Max для столбца
- greatest-n-per-group Получить лучшие результаты для каждой группы (в Oracle)
- greatest-n-per-group Как выбрать самый последний набор датированных записей из таблицы MySQL
- greatest-n-per-group Как я могу выбрать строки с MAX (значение столбца), DISTINCT по другому столбцу в SQL?
- greatest-n-per-group Получение последней записи в каждой группе - MySQL