我在这里看到了类似的问题,但没有一个对我的情况有帮助。
我有一个表可以说测试(使用 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 行,其中没有最新的行。
多谢
我认为通过下面的操作你可以实现你所需要的,这些操作被称为“Group-wise Maximum”。
Option 1
这是最容易理解的,子查询将返回最大值TID
自此以来的所有用户max
与一起使用Group By
然后我们执行其他查询来获取这些 ID 的所有数据。
Select TID, TData, TUserID, TViewedAt
From Test
Where TID In(
Select Max(TID)
From Test
Group By TUserID
)
Option 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;
Result
TID TData TUserID TViewedAt
4 test3 123 2012-10-05 00:00:00.000
5 test2 213 2012-10-03 00:00:00.000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)