@GreenSun

Выбор последних данных для каждого пользователя из mysql

Здравствуй, многоуважаемый all!

В процессе познания истины mysql существует табличка userData с данными пользователей за определенное время.
На настоящее время в табличке 54 000 записи, планируется рост.
Ее упрощенная структура: dataTime (timestamp), id (bigint айди пользователя), data (информация пользователя в json). В структуру изменения вносить нельзя.
time и id уникальны для каждой строки.
Задача: для определнных id пользователей выбрать самые актуальные (с самой поздней датой) полные строки (со всеми столбцами).

Своими силами получились несколько вариантов:
(SELECT * FROM userData WHERE id=1 ORDER BY dataTime LIMIT 1) UNION
(SELECT * FROM userData WHERE id=222 ORDER BY dataTime LIMIT 1) UNION
(SELECT * FROM userData WHERE id=333 ORDER BY dataTime LIMIT 1) UNION
(SELECT * FROM userData WHERE id=444 ORDER BY dataTime LIMIT 1) UNION
(SELECT * FROM userData WHERE id=555 ORDER BY dataTime LIMIT 1)

Крутой вариант, выполняется за 0.001 сек. Но с очевидным минусом при запросе с 1000 айдишниками будут хорошо расти логи, бегать длинные запросы и умирать котята, чего бы не хотелось делать.

SELECT * FROM userData WHERE (id, dataTime) IN (select id, max(dataTime) maxTime from userData b where id in (1, 222, 333, 444, 555) group by id)

Выполняется за 12 сек, зато маленький.

Нужен вариант с малым временем исполнения, изврат допускается.
  • Вопрос задан
  • 3108 просмотров
Решения вопроса 1
GeneMoss
@GeneMoss
void
Попробуйте так:
SELECT data.* 
FROM userData AS data
JOIN (
	SELECT id, MAX(dataTime) AS dataTime
	FROM userData
	WHERE id IN (1, 222, 333, 444, 555)
	GROUP BY id
) AS max USING (id, dataTime);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Посмотри возможно поможет
www.sql.ru/forum/687908/faq-vyborka-pervoy-posledn...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы