gpt4 book ai didi

MySQL 按 ID 和最新日期时间分组

转载 作者:可可西里 更新时间:2023-11-01 06:40:11 25 4
gpt4 key购买 nike

我在这里看到了类似类型的问题,但没有一个对我的情况有帮助。

我有一个表可以说测试(使用 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”。

选项 1

这是最容易理解的,子查询将为所有用户返回最大 TID,因为 maxGroup 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 和最新日期时间分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12752375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com