![](/img/trans.png)
[英]MySQL - COUNT, GROUP BY, ORDER BY and get latest Datetime
[英]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
,因为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
您需要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.