2013-10-12 3 views
1

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

select a.username, b.last_post from logins as a join (select login_id, entry as last_post from posts) as b where a.id = b.login_id

+-----------+---------------------+ 
| username | last_post   | 
+-----------+---------------------+ 
| something | 2013-10-08 22:12:00 | 
| other  | 2013-10-08 22:13:00 | 
| test  | 2013-10-08 22:13:03 | 
| test  | 2013-10-08 22:14:20 | 
| hello  | 2013-10-08 22:12:53 | 
| hello  | 2013-10-08 22:12:56 | 
+-----------+----------+----------+ 

Так прямо сейчас last_post просто отметка времени поста он тянет. Как получить таблицу, которая отображает ТОЛЬКО последнее сообщение от этих пользователей?

ответ

3

если вам нужно только две колонки, вы можете напрямую использовать MAX()

SELECT a.username, 
     MAX(b.entry) last_post 
FROM logins a 
     INNER JOIN posts b 
     ON a.id = b.login_id 
GROUP BY a.username 

в противном случае, если вы хотите, чтобы показать все столбцы всех таблицы, вы можете иметь подзапросов, которые по отдельности получает последнюю entry для каждого login_id

SELECT a.*, b.* 
FROM logins a 
     INNER JOIN posts b 
      ON a.id = b.login_id 
     INNER JOIN 
     (
      SELECT login_id, MAX(entry) entry 
      FROM posts 
      GROUP BY login_id 
     ) c ON b.login_id = c.login_id AND 
       b.entry = c.entry 
+0

спасибо! можете ли вы объяснить использование 'group by' в первом запросе, но не во втором? Кстати, я использовал второй. – bvpx

+1

просто группирует запись по 'username' и для каждого пользователя, она получает последнюю' запись', используя 'MAX()' –

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