我需要从mysql表中检索具有唯一值的最新行。 简单的表格布局是时间戳(now())和用户名列。 该表每秒获取几次新数据,我需要最新的行,其中username是唯一的。
SELECT MAX(timestamp) as timestamp, username
FROM bla
WHERE timestamp < (now() - interval 30 minute)
GROUP BY username
ORDER BY timestamp DESC
似乎这个查询没有返回最新的值,可能是因为该组正在做一些我不想要的事情......
答案 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