Mysql GROUP BY и уникальные ценности - PullRequest
2 голосов
/ 17 января 2010

У меня есть таблица в 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) Message и 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

Ответы [ 2 ]

1 голос
/ 17 января 2010
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, то она возвращает одну из них без какого-либо определенного порядка).

0 голосов
/ 17 января 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/

...