t-alexashka
@t-alexashka
Сразу пишу legacy код

Как вывести последние действия юзеров на сайте?

Есть несколько пользователей, по которым надо вытащить их последние действия на сайте.

Структура таблиц пользователей:
id, firstname
---------------
1, Vasiliy
2, Alex
...


Структура таблицы действий:
id, user_id, action_name, dttm
-----------------------------------
336, 2, SEARCH, 2019-10-04 12:00:01
335, 2, CREATE_POST, 2019-10-04 11:20:44
334, 1, LOGIN, 2019-10-04 11:18:55
...


т.е. в данном случае у user = 2 последнее действие - поиск (SEARCH), а у user = 1 последнее действие вход (LOGIN)

как мне вывести это в таком виде, для нескольких пользователей (не для всех):
user_id, last_action, last_action_date:
----------------------------------
1, LOGIN, 2019-10-04 11:18:55
2, SEARCH, 2019-10-04 12:00:01


Таблица с логами действий крупная (более млн записей), и мои joinы слишком долго работают. Задача вроде тривиальная, но моя кукуха меня подводит.

Спасибо за помощь!
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
isset89
@isset89
Врёшь, тебе нравится
Одни джойны)))

SELECT a.user_id, ab.last_action, s.times
FROM user a
INNER JOIN (SELECT user_id, max(last_action_date) AS times
FROM user
GROUP BY user_id) s ON s.user_id = a.user_id and s.times = a.last_action_date
Left join user ab on s.user_id = ab.user_id and ab.last_action_date = s.times and a.last_action = ab.last_action
Where a.user_id in (1,2)
order by null
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
bitniks
@bitniks
Go/PHP/Symfony developer
SELECT a.user_id, a.action, a.dttm
FROM actions a
LEFT JOIN actions a1 ON a1.user_id = a.user_id AND a.dttm < a1.dttm 
WHERE a.user_id IN (1, 2) AND a1.dttm IS NULL;

Для пользователей c id 1, 2. Хорошо бы добавить индекс (user_id, dttm) в таблице действий
Ответ написан
Ваш ответ на вопрос

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

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