MYSQL查询:最新时间戳+过去30分钟的唯一值

时间:2011-02-10 19:13:00

标签: mysql

我需要从mysql表中检索具有唯一值的最新行。 简单的表格布局是时间戳(now())和用户名列。 该表每秒获取几次新数据,我需要最新的行,其中username是唯一的。

SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp < (now() - interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 

似乎这个查询没有返回最新的值,可能是因为该组正在做一些我不想要的事情......

4 个答案:

答案 0 :(得分:6)

如果您正在尝试查看过去30分钟,那么我认为您希望使用“大于”而不是“小于”。

... WHERE timestamp > (now() - interval 30 minute) ...

答案 1 :(得分:3)

虽然您编写的内容确实有效,但更快的解决方案可能是使用LEFT JOIN在DB上我正在处理LEFT JOIN实际上是两倍的速度,因为您获得了最新的所有列行如果你想要那些信息:

SELECT *
    FROM `bla`
    WHERE bla.created_at > (now() - interval 30 minute) AND (next_bla.created_at IS NULL)
    LEFT JOIN bla next_bla ON bla.username = next_bla.username AND bla.created_at < next_bla.created_at
    ORDER BY bla.created_at DESC

这匹配bla /下一行中的每一行与时间戳w /相同的用户名,并选择没有下一行的行(next_bla.created_at IS NULL),即它们是最近的行。

您还可以使用LIMIT子句来提高性能。

这是一篇很好的文章,解释了GROUP BY如何详细和清晰的语言: http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html

Andomar的另一个类似答案 - MySQL "Group By" and "Order By"

答案 2 :(得分:2)

SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp > (now() - interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 

答案 3 :(得分:0)


SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp > date_sub(now(), interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC