Я предполагаю из вашего заявления о желаемом результате, что вы хотите найти текущую активность каждого пользователя. Я также предполагаю, что у пользователя может быть много сеансов и текущий сеанс имеет самый высокий идентификатор сеанса.
Конечно, если у вас есть только один сеанс на пользователя и одна запись user_activity на пользователя, это не проблема, и ваш принятый ответ в порядке.
Ключевой вопрос здесь - определить последнюю запись user_activity для каждого пользователя и использовать ее для перехода к действию.
Это может быть выполнено следующим образом: -
SELECT u.username,
a.name
FROM user_activity AS ua
JOIN session AS s ON ua.session_id = s.session_id
JOIN user AS u ON u.user_id = s.user_id
JOIN activity AS a ON ua.activity_id = a.activity_id
WHERE ua.user_activity_id IN (
SELECT MAX(ua2.user_activity_id)
FROM user_activity AS ua2
JOIN session AS s2 ON ua2.session_id = s2.session_id
GROUP BY s2.user_id);
Следующие тестовые данные подтверждают SQL. Он создает 4 пользователя и 4 действия, затем создает запись user_activity для каждого пользователя, выполняющего работу по дому. Затем он настраивает трех пользователей на их обычную активность.
INSERT INTO user (username) VALUES ('sneezy');
INSERT INTO user (username) VALUES ('grumpy');
INSERT INTO user (username) VALUES ('happy');
INSERT INTO user (username) VALUES ('snow_white');
INSERT INTO session (user_id) SELECT u.user_id FROM user AS u;
INSERT INTO activity(name) VALUES ("Sneezing");
INSERT INTO activity(name) VALUES ("Frowning");
INSERT INTO activity(name) VALUES ("Smiling");
INSERT INTO activity(name) VALUES ("Housework");
INSERT INTO user_activity (session_id, activity_id)
SELECT s.session_id, a.activity_id
FROM session AS s JOIN activity AS a
WHERE a.name IN ("Housework");
INSERT INTO user_activity(session_id, activity_id)
SELECT s.session_id, a.activity_id
FROM session AS s
JOIN USER as u ON s.user_id = u.user_id
JOIN activity AS a ON a.name = 'Sneezing'
WHERE u.username = 'sneezy' ;
INSERT INTO user_activity(session_id, activity_id)
SELECT s.session_id, a.activity_id
FROM session AS s
JOIN USER as u ON s.user_id = u.user_id
JOIN activity AS a ON a.name = 'Frowning'
WHERE u.username = 'grumpy' ;
INSERT INTO user_activity(session_id, activity_id)
SELECT s.session_id, a.activity_id
FROM session AS s
JOIN USER as u ON s.user_id = u.user_id
JOIN activity AS a ON a.name = 'Smiling'
WHERE u.username = 'happy' ;
Это приводит к следующим результатам
snow_white Housework
sneezy Sneezing
grumpy Frowning
happy Smiling