![](/img/trans.png)
[英]mysql. I want to get the max value of all rows with a specific date and use the corresponding fields
[英]mySQL - Select by max date and get other fields of corresponding row
我知道这个问题被问了很多,但是到目前为止我还不能解决问题,所以我要问一个新问题。
我有这张桌子:
Id user_id game_id date
1 1 1 2015-05-25 15:05:00
2 1 2 2015-05-25 15:08:00
3 2 1 2015-05-26 16:34:23
4 2 2 2015-05-28 16:36:12
5 1 1 2015-05-27 17:24:11
6 1 2 2015-05-27 17:26:21
7 1 3 2015-05-27 17:28:47
我需要为具有最大日期的给定user_id选择行。 例如,对于user_id = 1,正确的记录应为数字7。
我已经尝试过使用此查询,但是它选择了找到的第一个game_id
SELECT game_id, MAX(date) AS date FROM play_tbl WHERE user_id = 1 GROUP BY user_id
提前致谢。
首先,您需要像这样为每个用户获取最大日期:
SELECT user_id, MAX(date) AS latestDate
FROM myTable
GROUP BY user_id;
一旦有了这些值,就可以将它们重新连接到原始表,前提是user_id和LatestDate列匹配,以便获得整行。 最终查询是这样的:
SELECT m.*
FROM myTable m
JOIN(
SELECT user_id, MAX(date) AS latestDate
FROM myTable
GROUP BY user_id) tmp ON tmp.user_id = m.user_id AND tmp.latestDate = m.date;
这是一个SQL Fiddle示例。
关系数据库最好在数据集中处理。 因此,您需要一组由每个用户的最长时间和用户ID组成的数据。 然后将此子集重新加入基本集,以获取您可能需要的其他列。
SELECT A.ID, A.user_ID, A.Game_ID, A.date
FROM play_tbl a
INNER JOIN (SELECT max(date) mdate, user_ID
FROM play_table GROUP BY user_Id) b
on a.user_Id = B.user_ID
and A.Date = B.mdate
这将生成一个由每个用户的max_date组成的子集,然后重新加入整个集合以过滤每个用户的最大日期,从而使您可以获取其他值。
或者,您可以这样做,但我认为效率较低。 您也可以使用存在来做到这一点...
SELECT A.ID, A.user_ID, A.Game_ID, A.date
FROM play_tbl a
WHERE (A.user_Id, A.Date) in
(SELECT User_ID, max(date) date FROM play_tbl B
WHERE a.user_Id = B.user_ID
and A.Date = B.date
GROUP BY user_Id)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.