2015-02-03 2 views
1

Я сделал хороший поиск аналогичного вопроса, но без радости. Я думаю, что ответ на мой вопрос основан на DISTINCT, GROUP и UNION, но просто не может соединить их, что имеет смысл.Вывод данных из двух таблиц с использованием последней записи

У меня есть 2 таблицы:

users(id, username) 
activitylog(id, userid, usernamedisp, activity) 

Образец данных:

users 
id, username 
1, Joe Bloggs 
2, Jane Doe 
3, John Smith 

activitylog 
id, userid, usernamedisp, activity 
1,  3, John Smith , logged in 
2,  3, John Smith , visited about us page 
3,  1, Joe Bloggs , logged in 
4,  3, John Smith , logged out 
5,  2, Jane Doe , logged in 
6,  1, Joe Bloggs , logged out 
7,  2, Jane Doe , visited about us page 

(есть еще один не связан, но веская причина, почему имя пользователя появляется в обеих таблицах)

I хотите, чтобы вывести список пользователей по порядку users.id вместе с именем activitylog.username и, наконец, только самую последнюю активность. должен выглядеть следующим образом:

User, Username , Last Activity 
    1, Joe Bloggs, logged out 
    2, Jane Doe , visited about us page 
    3, John Smith, logged out 

В то время как я мог это сделать, выполнив запрос внутри цикла по каждому результату (SELECT, активность из activitylog где Идентификатор_пользователя = $ Foo ORDER BY DESC ид, LIMIT 0,1) - Я предпочел бы запустить все это в одном красивом чистом фрагменте кода, так как количество пользователей может быть между 50-100, и это слишком много запросов для моего комфорта.

Я уверен, что это возможно, но я просто не могу представить его вместе.

ответ

1

YOU нужен запрос из двух частей: один для получения списка usersID и их «max» id, который будет их последней деятельностью. Затем контейнерный запрос, который принимает эти идентификаторы и извлекает остальную информацию:

SELECT activitylog.userid, users.username, activitylog.activity 
FROM activitylog 
LEFT JOIN users ON activitylog.userid = users.id 
WHERE activitylog.id IN (
    SELECT MAX(id) 
    FROM activitylog 
    GROUP BY userid 
) 
+0

спасибо за ваш скорый ответ, однако код, который вы перечислили выше возвращает только один результат ... пользователь с самым высоким/самым последнем activitylog.id – teddytash

+0

не должен. подзапрос вернет последний идентификатор для каждого пользователя в таблице действий. –

+0

@MarcB ActivityLog не имеет колонки имени пользователя, вероятно, вы должны заменить группу по столбцу на userid/usernamedisp. Вероятно, именно это и вызывает неожиданное поведение. – SoulTrain

0

Просмотров: от обсуждения в комментариях ...

Этот запрос должен предоставить вам следующее решение, которое вы ищете.

SELECT AL.userid 
    ,users.username 
    ,AL.activity 
FROM users 
LEFT JOIN (
    SELECT activitylog.userid 
     ,activitylog.activity 
    FROM activitylog 
    WHERE activitylog.id IN (
      SELECT MAX(id) 
      FROM activitylog 
      GROUP BY userid 
      ) 
    ) as AL ON AL.userid = users.id 
+0

Большое вам спасибо. – teddytash

Смежные вопросы