MySQL таблица соединения с агрегатами - PullRequest
0 голосов
/ 12 августа 2011

У меня есть 2 таблицы.Person таблица и activity_log таблица

Есть много действий для каждого человека.

Я хотел бы "выбрать" список "людей", показывающий имя_действия и дату_действия их последнегодеятельность.(не все действия)

Таблица персон имеет person_id, имя, адрес электронной почты

Таблица активности содержит person_id, action_id, Activity_date, имя_операции

Спасибо за вашу помощь заранее.*

Ответы [ 2 ]

1 голос
/ 12 августа 2011

Подзапрос должен сделать трюк:

SELECT p.person_id, p.name, p.email, a.activity_id, a.activity_date, a.activity_name
FROM Person p
LEFT JOIN Activity a
ON p.person_id = a.person_id
WHERE a.activity_date = (SELECT MAX(a1.activity_date)
               FROM activity a1
               WHERE a.person_id = a1.person_id
               GROUP BY person_id) OR activity_date IS NULL;
1 голос
/ 12 августа 2011

Предполагая, что ваши идентификаторы автоматически нумеруются, вам нужно сделать следующее:

SELECT pe.person_id,
       pe.name,
       al.activity_name,
       al.activity_date
FROM   person pe
       LEFT JOIN (SELECT p.person_id,
                         Max(a.activity_id) activity_id
                  FROM   person p
                         LEFT JOIN activity_log a
                           ON ( p.person_id = a.person_id )
                  GROUP  BY p.person_id) AS LAST
         ON pe.person_id = LAST.person_id
       LEFT JOIN activity_log al
         ON LAST.activity_id = al.activity_id  

Однако пользователи могут войти в прошлые действия позже, чем новые, тогда это не удастся, и вам нужно будет сделать следующее:

SELECT LAST.person_id,
       LAST.name,
       LAST.activity_date,
       (SELECT activity_name
        FROM   activity_log al
        WHERE  al.person_id = LAST.person_id
               AND al.activity_date = LAST.activity_date) activity_name
FROM   (SELECT p.person_id,
               Max(p.name)          AS name,
               Max(a.activity_date) activity_date
        FROM   person p
               LEFT JOIN activity_log a
                 ON ( p.person_id = a.person_id )
        GROUP  BY p.person_id) AS LAST  

Но это все еще имеет проблему: поскольку MySQL не допускает LIMIT в подзапросах, запрос завершится ошибкой, если у одного и того же человека есть два действия с одинаковым activity_date и это самая последняя дата.

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