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

时间:2015-05-27 18:26:02

标签: php mysql

我知道这个问题很多,但到目前为止我无法解决问题,所以我问了一个新问题。

我有这张桌子:

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

您需要首先抓住每个用户的最大日期,如下所示:

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示例。

答案 1 :(得分:0)

关系数据库最好在数据集中处理。因此,您需要一组数据,包括每个用户的最大日期和用户的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)