当前位置: 首页 > 面试题库 >

MySQL Group按ID和最新日期时间

曹新觉
2023-03-14
问题内容

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

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

现在,当前html" target="_blank">登录的用户每次访问测试页时,都会向该表添加记录,以记录访问过的用户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的所有数据。

 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


 类似资料:
  • 问题内容: 现在我用下面的查询按每篇文章的auto_increment id进行即时排序 我想知道如何按我创建的日期字段排序,该字段通过strtotime()存储当前日期,它应该查询从最新到最旧的日期。 当前代码 问题答案: 只需更改ORDER BY中的列即可:

  • 问题内容: 在下面的表格中,我需要获取状态日期等于2的最大日期的行 我需要使用此请求获取具有最大日期和按REMUN_ID分组的行 结果 : 我需要调整请求以从此结果中仅获取statut = 2的行 我的目的是获取以下结果,这是第一个查询的子查询,以仅获取具有状态2的子查询。 PS:如果我使用了将从中得到这些结果的子句: 那不是我想要的。 有什么建议?谢谢 问题答案: SQLFiddle:http

  • 问题内容: 我有一个具有project_id int,update_date datetime和update_text varchar(max)的SQL Server表 该表的每个project_id都有许多更新。我需要通过update_date获取所有project_id值的最新信息。 例子: 该查询应获得: 问题答案: 使用 与 extrester演示:http://rextester.com

  • 问题内容: 我有一个这样的收藏: 我如何从MongoDB获得最新记录,而日期时间是最新记录?我只想要一条记录。 问题答案: 使用和:

  • 问题内容: 我正在网站上构建一个便笺系统,现在用户可以使用PHP将便笺发布到MySQL数据库,然后PHP将其打印在页面上。但是,当他们打印/回显时,最早的显示在最前面,但我要显示最新的在列。我也希望将它们限制为10个,因此页面上仅显示10个。这是我的PHP代码,将非常感谢您的帮助: 问题答案: 这应该做到:

  • 我正在尝试通过ID和日期聚合数据帧。假设我有一个DataFrame: 我想通过ID和日期(频率=1W)聚合该值,并得到一个dataframe如下所示: 我理解它可以通过迭代ID并使用grouper聚合价格来实现。有没有更有效的方法不迭代IDS?多谢。