我在这里看到了类似的问题,但是没有一个问题帮助我解决了这个问题。
我有一个表可以说测试(使用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行,其中所有行都不是最新的。
多谢
我认为,通过以下操作,您可以实现所需的功能,这些操作称为“逐组最大值”。
选项1
这是最容易理解的,子查询将为TID所有用户返回最大值,这max是因为与Group By和一起使用时,我们比另一个查询要获取这些ID的所有数据。
TID
max
Group By
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。
t1.TViewedAt
t2.TViewedAt
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