2013-05-10 3 views
0

У меня есть таблица, которая выглядит как образец ниже. Мне нужно получить самую последнюю дату для указанного пользователя.Получение самой последней даты после использования группы с помощью mySQL

id sender_id receiver_id content date    
-- --------- ----------- ------- ----    
1 5   7   test 2013-03-13 10:33:54 
2 13  7   test 2 2012-03-13 12:01:36 
3 5   7   test 3 2013-01-05 09:15:37 
4 13  7   test 4 2013-04-05 08:17:39 

Мой текущий SQL выглядит следующим образом:

SELECT * FROM `messages` WHERE receiver_id=7 group by sender_id 

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

4 13  7   test 4 2013-04-05 08:17:39 
1 5   7   test 2013-03-13 10:33:54 

Do Мне нужно сделать какой-то суб-выбор, чтобы получить самую последнюю дату?

+0

Вы пробовали 'ORDER BY date DESC'? –

+0

Возможный дубликат [Выберите самые последние результаты на основе композитных полей] (http://stackoverflow.com/questions/3817204/select-most-recent-results-based-on-composite-of-fields) – Barmar

ответ

2

Вы группируете sender_id, но возвращаете все столбцы. Значение неагрегированных строк может быть недооценено и не зависит от порядка.

Вы можете использовать запрос, как это, чтобы получить результаты, которые вам нужны:

SELECT * 
FROM messages 
WHERE (sender_id, receiver_id, date) IN (
      SELECT sender_id, receiver_id, MAX(date) 
      FROM  messages 
      WHERE receiver_id=7 
      GROUP BY sender_id, receiver_id) 

Пожалуйста, смотрите скрипку here.

+0

Это работает, но как я могу фильтровать определенный приемник_id? (например, WHERE receiver_id = 7) – Paul

+0

@Paul см. мой обновленный ответ. Это вернет последнее сообщение каждого sender_id, у которого есть receiver_id = 7 – fthiella

+0

, он работает, но привязывает мой процессор более минуты ... моя текущая таблица содержит около 300 тыс. Строк и, возможно, 30 строк для receiver_id 7 – Paul