我知道这个问题很多,但到目前为止我无法解决问题,所以我问了一个新问题。
我有这张桌子:
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
提前致谢。
答案 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)