2011-09-03 67 views
3

的最後一個動作我有一個表是這樣的:MySQL的:選擇每個用戶

ActionTime    UserID  Score 
2011-08-15 12:06:00  1    14 
2011-08-15 14:45:00  2    17 
2011-08-16 12:17:00  1    20 <== select this row 
2011-08-16 04:28:00  2    14 
2011-08-17 06:52:00  2    16 <== select this row 

我想了解每個用戶在他們的最後一個動作的得分和ActionTime。 (如上所示)

我知道我能做到一個個像這樣的:

SELECT * from MyTable WHERE UserID=? ORDER BY ActionTime DESC LIMIT 1 

但我們有數百種不同的用戶名的(和它保持課程的增加)。這將導致大量的PHP到MySQL的通信,這是不可接受的。

我只是想知道是否有可能一次獲得所有的行執行/通信?

回答

10

如果您爲每個用戶ID的最大ActionTime第一個查詢,你可以使用它作爲一個子查詢,選擇得分:

SELECT m.* 
FROM MyTable AS m 
INNER JOIN (
    SELECT MAX(i.ActionTime) ActionTime, i.UserID 
    FROM MyTable i 
    GROUP BY i.UserID 
) AS j ON (j.ActionTime = m.ActionTime AND j.UserID = m.UserID) 

有與上述SQL的一個問題 - 如果同一用戶擁有更多比具有相同ActionTime的1行,您將獲得該用戶的多行。如果你決定要在這種情況下,最高的分數,你可以這樣做:

SELECT m.ActionTime, m.UserID, MAX(m.Score) Score 
FROM MyTable AS m 
INNER JOIN (
    SELECT MAX(i.ActionTime) ActionTime, i.UserID 
    FROM MyTable i 
    GROUP BY i.UserID 
) AS j ON (j.ActionTime = m.ActionTime AND j.UserID = m.UserID) 
GROUP BY m.UserID 
+0

好極了!這正是我正在尋找的。 – LazNiko

-1

SELECT * FROM MyTable的集團通過用戶ID ORDER BY ActionTime DESC

+2

ORDER BY應用於GROUP BY子句後的結果集 - 它不能更改結果集,只能重新排序,因此無法確保所選的ActionTime是最新的,或者選擇的分數與它匹配。 – Gus

+0

你是對的。我的錯。謝謝 – ZigZag