Я пытаюсь написать запрос, в котором я хотел бы получить список последних "специальных действий" пользователей, поэтому у меня есть следующие таблицы:
table_users
id username email etc.
1 moloc a@mail.com etc.
2 lilly b@mail.com etc.
3 sammm c@mail.com etc.
table_special_actions
id user_id action_id date
1 3 25 2010-11-01 22:51:56
2 3 37 2010-11-02 18:09:33
3 3 265 2010-11-03 07:20:12
table_actions
id action
1 Open a secret
2 Level up
3 Open magic door
etc. etc.
Моя цель - получить список пользователей, в котором у меня есть только последнее специальное действие для каждого, поэтому я подумал примерно так:
SELECT *
FROM table_users AS users
LEFT JOIN (
SELECT user_id, action_id, MAX(date) AS action_date
FROM table_special_actions
GROUP BY user_id
ORDER BY action_date
) s_actions
ON s_actions.user_id = users.user_id
LEFT JOIN table_actions AS actions
ON s_actions.action_id = actions.id
Это не работает должным образом, потому что возвращает это:
-----users----- ------------s_actions------------ -----actions-----
id username action_id date action
3 sammm 25 2010-11-03 07:20:12 Action linked to action_id 25
Я ожидал получить это:
-----users----- ------------s_actions------------ -----actions-----
id username action_id date action
3 sammm 265 2010-11-03 07:20:12 Action linked to action_id 265
Странно, что action_id, я всегда получаю последнюю дату, и это нормально, но я также всегда получаю первый action_id вместо того, который указан относительно правильной строки даты.
Где я не прав?