MySQL: получение самого последнего действия в строке - PullRequest
1 голос
/ 09 декабря 2010

Я пытаюсь написать запрос, в котором я хотел бы получить список последних "специальных действий" пользователей, поэтому у меня есть следующие таблицы:

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 вместо того, который указан относительно правильной строки даты.

Где я не прав?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

Ты рядом. Попробуйте:

SELECT *
    FROM table_users AS users
        LEFT JOIN (SELECT user_id, MAX(date) AS MaxDate
                       FROM table_special_actions
                       GROUP BY user_id) s_actions
            ON s_actions.user_id = users.user_id
        LEFT JOIN table_special_actions s2_actions
            ON s_actions.userid = s2_actions.id
                AND s_actions.MaxDate = s2_actions.date
        LEFT JOIN table_actions AS actions
            ON s2_actions.action_id = actions.id
0 голосов
/ 09 декабря 2010

Вы получили этот результат, вероятно, потому что вы использовали статистическую функцию (MAX) и сгруппировали только по первому столбцу (user_id) и оставили второй столбец (action_id) вне группировки и агрегирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...