2011-02-10 71 views
5

我需要从我的mysql表中检索具有唯一值的最新行。 简单的表格布局是时间戳(now())和用户名列。 该表每秒获取一次新的数据,并且我需要用户名是唯一的最新行。MYSQL查询:最近30分钟的最新时间戳+唯一值

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

看来,这查询不返回的最新值,可能是因为该集团在做一些事情,我不想......

+0

所以基本上你想要的最新行对每个在最近30分钟内插入的用户?另外,请注意`timestamp`是mysql中的保留字。您应该为该字段使用不同的名称,或者使用反引号将其“转义”。 – 2011-02-10 19:18:13

+0

是的你是正确的,我的专栏使用另一个名称作为时间戳值,这只是一个例子:)无论如何感谢提示! – HyperDevil 2011-02-10 19:26:02

回答

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

如果你想看看最后30分钟,然后我想你想用“大于”而不是“小于”。

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

虽然你写不工作,更快的解决方案可能是使用LEFT JOIN在我工作的离开了DB 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 /通过时间戳W /相同的用户名的下一行,并挑选一个没有未来的行行(next_bla.created_at IS NULL),即它们是最近的行。

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

这是一个很好的文章,介绍如何GROUP BY的细节和清晰的语言作品: ​​

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

0

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