Mysql GROUP BY и уникальные значения

У меня есть таблица в MySQL:

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

Правильным результатом будет:

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


person x17az    schedule 17.01.2010    source источник


Ответы (2)


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

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

person Kamil Szot    schedule 17.01.2010

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/

person Messa    schedule 17.01.2010