2012-10-26 29 views
5

Si supponga Ho una tabella di MySQL:Come posso selezionare l'input più recente per ciascun membro?

 
╔══════╦═════╦═════════╦═════════╗ 
║ 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 ║ 
╚══════╩═════╩═════════╩═════════╝ 

il tempo è un timestamp UNIX. mid è l'id membro. field_1 è fornito dal membro. field_2 viene compilato automaticamente.

Desidero selezionare la riga con il campo non zero più recente_1 per tutti i membri. Quindi la domanda si tradurrebbe in:

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

L'unica soluzione mi è venuta non sembra molto elegante:

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

C'è un modo migliore?

+0

Cercate di conoscere [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

risposta

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

L'idea è quella di creare una sottoquery che ottiene il massimo time per ogni mid e unirsi alla tabella stessa.

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

Problemi correlati