MySQL ID按ID和最新日期时间

我在这里看到了类似的问题,但没有一个能帮我解决问题.

我有一个表让我说测试(使用mysql MyISAM)

测试具有以下架构:

    TID INT PRIMARY KEY AUTO_INCREMENT
    TData varchar (data that i want to select)
    TUserID INT (this will be joined with users table, same users can have many records here)
    TViewedAt DATETIME (records each time user visits page, datetime format)

现在,每当当前登录用户访问测试页面时,它都会向该表添加记录,记录访问过的用户ID,用户访问过的一些数据和日期和时间,每次TID自动递增.

然后我有一个后端管理页面,我可以看到哪个用户访问了测试页面,有多少次,数据和时间.基本上它是一个包含20-25个最新行列表的表.我的查询应该只为每个数据选择一个记录.用户可以在不同的时间使用相同的数据,但我只想为每个用户选择一个最新的数据.因此,如果用户访问测试页10次,则10条记录进入数据库,但在表上仅显示1条最新记录.如果另一个用户访问页面15次,则显示该第二个用户的1条记录,这是最新的记录,所以总共现在我们在桌面上显示2行.我得到了一切工作,但由于某种原因GROUP BY和MAX(日期)没有给我每个日期的最新日期时间.

这是我的查询:

   SELECT *
   FROM Test
   WHERE TUserID = 123
   GROUP BY TData
   ORDER BY TViewedAt

返回2行,其中没有一行是最新的.

非常感谢

最佳答案
我认为用下面你可以实现你所需要的,这些操作被称为“Group-wise Maximum”.

选项1

这是最容易理解的,子查询将返回所有用户的最大TID,因为max与Group By一起使用,而不是我们执行其他查询来获取这些ID的所有数据.

 Select TID, TData, TUserID, TViewedAt
 From Test 
 Where TID In(
    Select Max(TID)
    From Test
    Group By TUserID
)

选项2

稍微复杂一点,但很可能更有效,这是基于当t1.TViewedAt处于其最大值时,没有t2.TViewedAt具有更大的值并且t2行值将为NULL.

SELECT t1.TID, t1.TData, t1.TUserID, t1.TViewedAt
FROM Test t1
LEFT JOIN Test t2 ON t1.TUserID = t2.TUserID AND t1.TViewedAt < t2.TViewedAt
WHERE t2.TUserID IS NULL;

结果

TID TData   TUserID   TViewedAt
4   test3   123       2012-10-05 00:00:00.000
5   test2   213       2012-10-03 00:00:00.000

转载注明原文:MySQL ID按ID和最新日期时间 - 代码日志