2012-10-26 47 views
5

假設我有一個MySQL表:如何爲每個成員選擇最近的輸入?

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

時間是一個UNIX時間戳。 mid是會員ID。 field_1由會員提供。 field_2會自動填充。

我希望爲所有成員選擇具有最近非零字段_1的行。因此,查詢將導致:

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

我想出的唯一辦法似乎並不很優雅:

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

有沒有更好的辦法?

+0

嘗試瞭解[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

回答

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

這裏的想法是創建一個子查詢,該子查詢爲每個mid獲取最大值time並將其加入表中。

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