2010-01-17 3 views
1

У меня есть таблица в MySQL:Mysql GROUP BY и уникальные значения

 
SID DID MessageType DateOf Message 
1 255 LOG  2010-01-17 15:02:05 Log msg 1  
2 255 USER 2010-01-17 19:02:05 User msg 1 
3 211 LOG  2010-01-17 15:06:55 Log msg 2  
4 211 ADMIN 2010-01-17 22:06:55 Admin msg 1 

Мне нужно, чтобы получить последний (по DateOf) Сообщение и MessageType, сгруппированной по DID, по заказу DateOf DESC

Right результатом будет:

 
DID MessageType DateOf Message 
211 ADMIN  2010-01-17 22:06:55 Admin msg 1 
255 USER  2010-01-17 19:02:05 User msg 1 

Как это сделать, чтобы выбрать запрос? MySQL 5.1

ответ

1
SELECT * FROM `test` WHERE (DID,DateOf) IN (
    SELECT DID,MAX(DateOf) FROM `test` GROUP BY DID 
) GROUP BY DID ORDER BY DateOf DESC 

Подзапрос выбирает max DateOf для каждого DID. Внешний запрос выбирает строки с данными DateOf и DID. GROUP BY во внешнем запросе гарантирует, что для каждого DID будет только одна строка (если в таблице есть несколько строк с одинаковыми DID и DateOf, то она возвращает один из них без какого-либо определенного порядка).

0
SELECT * FROM test t JOIN (
    SELECT DID, MAX(DateOf) AS DateOf FROM test GROUP BY DID 
) t2 ON (t.DID = t2.DID AND t.DateOf = t2.DateOf) 
ORDER BY t.DateOf DESC; 

Другое решение:

SELECT * FROM test t WHERE DateOf = (
    SELECT MAX(DateOf) FROM test t2 WHERE t2.DID = t.DID 
) ORDER BY DateOf DESC; 

Когда я решала это некоторое время назад я гугле эту полезную статью: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/