繁体   English   中英

MySQL ID按ID和最新日期时间

[英]MySQL Group by ID and Latest Datetime

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

我有一个表让我说测试(使用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(日期)没有给我每个日期的最新日期时间。

这是我的查询:

   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

您需要GROUP BY TUserID作为最大聚合。

SELECT
  TID,
  TData,
  main.TUserID
  main.TViewedAt
FROM
  yourTable main
  JOIN ( 
    SELECT TUserID, MAX(TViewedAt) AS TViewedAT FROM yourTable GROUP BY TUserID
  ) tmax ON main.TUserID = tmax.TUserID AND main.TViewedAt = tmax.TViewedAt

这是一个连接子查询的可移植方法。 子查询为每个用户提取最新的TUserID,TViewedAt ,然后将其连接到主表以拉出匹配的TData

如果您一次只需要一个用户,则可以执行以下操作:

SELECT 
  TData,
  TViewedAt
FROM yourTable
WHERE TUserID = 'someid'
GROUP BY TUserId
HAVING TViewedAt = MAX(TViewedAt)

以上内容只能在我编写的MySQL中使用。 其他RDBMS会抱怨TData出现在SELECT列表中但不在GROUP BY

以下查询,可以帮助您 -

select * from pages where date(create_date)=(select date(create_date) from pages order by create_date limit 1)
SELECT t1.TData, t1.TUserID, t1.TViewedAt 
FROM Test t1
JOIN
(SELECT TUserID, MAX(TViewedAt)
FROM Test
GROUP BY TUserID) t2
ON t1.TUserID = t2.TUserID AND t1.TViewedAt=t2.TViewedAt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM