Я предполагаю, что есть еще столбцы, которые вы хотите получить из таблицы (в противном случае решение DanB - лучший путь).
Давайте разделим это на два шага:
- Получите максимальные даты для каждого
id
- Получите необходимые данные
Первый шаг очень прост:
SELECT id, max(date)
FROM tab
GROUP BY id
Важно: оба столбца должны быть проиндексированы.
Теперь второй шаг - сложная часть.Как получить все необходимые данные?
Что бы я сделал:
- Создать временную таблицу с результатом запроса выше,
- Индексэто, и
- Присоединитесь к таблице с этой новой временной таблицей.
Итак, давайте попробуем:
CREATE TEMPORARY TABLE temp_dates
SELECT id, max(date) as mdate
FROM tab
GROUP BY id;
ALTER TABLE temp_dates
ADD UNIQUE INDEX u_id (id),
ADD INDEX i_mdate (mdate);
SELECT a.id, a.date -- Add all the columns you need
FROM tab AS a
INNER JOIN temp_dates AS b ON a.id=b.id and a.date=b.mdate;
Надеюсь, это поможет.