繁体   English   中英

MySQL-按最大日期选择并获取相应行的其他字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM