簡體   English   中英

mysql : 選擇每個用戶的最后一個動作

[英]mysql : select the last action of each user

我有一張這樣的表:

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

我想找出每個用戶在最后一次操作中的 Score 和 ActionTime。 (如上所示)

我知道我可以像這樣一一做到:

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

但是我們有數百個不同的 UserID(當然它還在不斷增加)。 這將導致大量 PHP 到 MySQL 的通信,這是不可接受的。

我只是想知道是否可以一次執行/通信獲取所有行?

如果首先查詢每個 UserID 的最大 ActionTime,則可以將其用作子查詢來選擇 Score:

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 存在一個問題 - 如果同一用戶有超過 1 行具有相同的 ActionTime,您將獲得該用戶的多行。 如果您決定在這種情況下獲得最高分數,您可以執行以下操作:

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

發現這個:

https://stackoverflow.com/a/30743971/7718073

對我有用,非常簡單的解決方案。 MAX() 將與時間戳一起使用。

SELECT * from MyTable Group by UserId ORDER BY ActionTime DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM