MySQL ID按ID和最新日期时间

Gio*_*rgi 7 mysql sql select group-by

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

我有一个表让我说测试(使用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)
Run Code Online (Sandbox Code Playgroud)

现在,每当当前登录用户访问测试页面时,它都会向该表添加记录,记录访问过的用户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
Run Code Online (Sandbox Code Playgroud)

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

非常感谢

A. *_*ius 12

我认为用下面你可以实现你所需要的,这些操作被称为"Group-wise Maximum".

选项1

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

 Select TID, TData, TUserID, TViewedAt
 From Test 
 Where TID In(
    Select Max(TID)
    From Test
    Group By TUserID
)
Run Code Online (Sandbox Code Playgroud)

选项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;
Run Code Online (Sandbox Code Playgroud)

结果

TID TData   TUserID   TViewedAt
4   test3   123       2012-10-05 00:00:00.000
5   test2   213       2012-10-03 00:00:00.000
Run Code Online (Sandbox Code Playgroud)