2012-10-26 14 views
5

Załóżmy Mam tabeli MySQL:Jak mogę wybrać najnowsze wejście dla każdego członka?

 
╔══════╦═════╦═════════╦═════════╗ 
║ time ║ mid ║ field_1 ║ field_2 ║ 
╠══════╬═════╬═════════╬═════════╣ 
║ 100 ║ 1 ║  32 ║  54 ║ 
║ 100 ║ 2 ║  0 ║  34 ║ 
║ 100 ║ 3 ║  44 ║  99 ║ 
║ 200 ║ 1 ║  0 ║  45 ║ 
║ 200 ║ 2 ║  0 ║  45 ║ 
║ 200 ║ 3 ║  4 ║  59 ║ 
║ 200 ║ 4 ║  45 ║  45 ║ 
╚══════╩═════╩═════════╩═════════╝ 

czas jest znacznik czasu UNIX. mid to identyfikator członka. pole_1 jest dostarczane przez członka. pole_2 jest wypełniane automatycznie.

Chciałbym wybrać wiersz z najnowszym niezerowym polem_1 dla wszystkich członków. Więc zapytanie spowodowałoby:

 
╔══════╦═════╦═════════╦═════════╗ 
║ time ║ mid ║ field_1 ║ field_2 ║ 
╠══════╬═════╬═════════╬═════════╣ 
║ 100 ║ 1 ║  32 ║  54 ║ 
║ 200 ║ 3 ║  4 ║  59 ║ 
║ 200 ║ 4 ║  45 ║  45 ║ 
╚══════╩═════╩═════════╩═════════╝ 

Jedynym rozwiązaniem wymyśliłem nie wydaje się bardzo elegancki:

 
SELECT * 
FROM (
    SELECT * 
    FROM t1 
    WHERE field_1 > 0 
    ORDER BY time DESC 
) AS a 
GROUP BY mid 

Czy istnieje lepszy sposób?

+0

spróbować dowiedzieć się o [MySQL JOIN] (http://dev.mysql.com/doc/refman/5.0/en/join.html) –

+0

http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group/ – newtover

Odpowiedz

1
SELECT a.* 
FROM t1 AS a 
INNER JOIN 
(
    SELECT mid, MAX(time) AS maxTime 
    FROM t1 
    WHERE field_1 <> 0 
    GROUP BY mid 
) b ON a.mid = b.mid AND a.time = b.maxTime 

SQL Fiddle

4

Chodzi o to, aby utworzyć podzapytanie, które otrzyma maks. time dla każdego mid i połączyć go z samą tabelą.

SELECT a.* 
FROM tableName a 
INNER JOIN 
(
SELECT mid, MAX(time) maxV 
FROM tableName 
WHERE field_1 > 0 
GROUP BY mid 
) b ON a.mid = b.mid and 
     a.time = b.maxV 

SQLFiddle Demo

Powiązane problemy