我在这里看到了类似的问题,但没有一个能帮助我解决问题。
我有一个表可以说Test(使用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行,其中没有一行是最新的。
非常感谢
答案 0 :(得分:11)
我认为,通过以下内容,您可以实现所需,这些操作被称为“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
答案 1 :(得分:1)
最大聚合需要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
中。
答案 2 :(得分:1)
以下查询,可能对您有帮助 -
select * from pages where date(create_date)=(select date(create_date) from pages order by create_date limit 1)
答案 3 :(得分:0)
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