小编典典

MySQL Group按ID和最新日期时间

sql

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

我有一个表可以说测试(使用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(date)不能为我提供每个日期的最新日期时间。

这是我的查询:

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

返回2行,其中所有行都不是最新的。

多谢


阅读 241

收藏
2021-03-23

共1个答案

小编典典

我认为,通过以下操作,您可以实现所需的功能,这些操作称为“逐组最大值”。

选项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
2021-03-23