Как получить самую последнюю запись с меткой времени для того же идентификатора из таблицы MySQL?
Возможный дубликат:
Извлечь строку, которая имеет значение Max для столбца
У меня есть таблица аудита людей и количества акций, которыми они владеют в определенный момент времени. Как мне получить самую последнюю запись для данного идентификатора?
MySQL таблица аудита
id name shares dateadded
1 Abc 12 2012-10-06 12:18:21
2 Klm 23 2012-10-06 12:18:21
3 Jim 45 2012-10-06 12:18:21
1 Abc 35 2012-11-06 12:18:21
1 Abc 65 2012-11-17 12:18:21
2 Klm 13 2012-11-06 12:18:21
Мой желаемый результат:
id name shares dateadded
1 Abc 65 2012-11-17 12:18:21
2 Klm 13 2012-11-06 12:18:21
3 Jim 45 2012-10-06 12:18:21
Я мог бы сделать что-то вроде этого:
select a.* from audittable a join audittable b
on a.id = b.id
where a.dateadded > b.dateadded;
Но это дает мне только те самые последние записи, которые повторяются. В этом случае идентификаторы 1,2, а не 3. Как получить список самых последних записей для всех идентификаторов без подзапросов или временных таблиц?
2 ответа
Вам понадобится подзапрос, но не подвыборы (которые очень негативно влияют на производительность).
JOIN
против подзапроса, который возвращает id
а также MAX(dateadded)
агрегат. Соединение подзапроса необходимо, чтобы иметь возможность сопоставлять все другие значения столбца в строке, содержащей последнюю метку времени.
SELECT
audittable.id,
name,
shares,
audittable.dateadded
FROM
audittable
/* Subquery returns id dateadded grouped by id */
JOIN (
SELECT id, MAX(dateadded) AS dateadded FROM audittable GROUP BY id
/* JOIN condition is on both id and dateadded between the two tables */
) maxtimestamp ON audittable.id = maxtimestamp.id AND audittable.dateadded = maxtimestamp.dateadded
Вот демонстрация на SQLfiddle
Без подзапросов вы ограничены этим
SELECT id, MAX(dateAdded)
FROM audittable
GROUP BY id
Если вы хотите, чтобы другие столбцы, вам нужен подзапрос, как ответ Михаила Берковски