MySQL ID按ID和最新日期时间

时间:2012-10-05 18:54:04

标签: mysql sql select group-by

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

我有一个表可以说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行,其中没有一行是最新的。

非常感谢

4 个答案:

答案 0 :(得分:11)

我认为,通过以下内容,您可以实现所需,这些操作被称为“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

答案 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