MySQL按最新时间戳选择

时间:2012-08-11 05:34:22

标签: mysql select timestamp

我在SO上看过一些类似的问题,但是,我无法找到解决我特定问题的方法。 (仅供参考,这些不是我真正的专栏,只是一个缩短的例子)。

我有一张基本表:

`my_table`

user_1           user_2                timestamp
======================================================
  23              25              2012-08-10 22:00:00
  24              22              2012-08-10 19:00:00   <=== I would like to return this row
  24              22              2012-08-10 17:00:00
  21              17              2012-08-10 15:00:00

所以,我想做的是:

 1) Select the "newest" row, based on timestamp AND 
 2) Select the 'user_2' column when given a value.  

我尝试过类似的事情:

 SELECT *
 FROM my_table
 WHERE user_2 = 22
 AND timestamp = (
 SELECT MAX( timestamp )
 FROM my_table )
 LIMIT 1 

但这并没有返回我正在寻找的行。任何有关修复此查询的帮助都会很棒。

非常感谢。

4 个答案:

答案 0 :(得分:56)

SELECT * FROM my_table -- standard stuff
   WHERE user_2 = 22 -- predicate
   ORDER BY timestamp DESC -- this means highest number (most recent) first
   LIMIT 1; -- just want the first row

编辑:

顺便说一句,如果你很好奇为什么你的原始查询不起作用,那就让我们分解一下:

  • my_table ...
  • 中选择一些内容
  • 其中user_2 = 22
  • timestamp = (有些值,我们暂时把它放在一边)
  • limit 1

现在,回到那个timestamp值,它来自你的子查询:

SELECT MAX( timestamp ) FROM my_table

请注意,此子查询不会基于user_2限制任何行 - 它会询问整个表中的最大时间戳 。最大时间戳是上表中的第一个:(user_1 = 23,user_2 = 25,timestamp = 2012-08-10 22:00:00)。

所以,让我们把它插回到顶级查询:

  • my_table ...
  • 中选择一些内容
  • 其中user_2 = 22
  • 和timestamp = 2012-08-10 22:00:00
  • limit 1

......你可以看到没有这样的一行。

答案 1 :(得分:4)

如果有人在SQL Server中遇到类似的问题,这将对您有用(上一篇文章中建议的MySQL查询在SQL Server中不起作用):

SELECT * FROM my_table 
WHERE    timestamp =  ( SELECT MAX( timestamp ) FROM my_table 
                        WHERE user_2 = 22 )

答案 2 :(得分:4)

在计算GROUP BY时,另一种方法是user_2 MAX(timestamp)列。这样做会使MAX(timestamp)计算不是整个表格中的最新日期,而是计算具有相同user_2值的每个记录的最新时间戳

因此,例如,您的查询可能是:

SELECT * FROM my_table
WHERE user_2 = 22
AND timestamp =
  (SELECT MAX(timestamp) FROM my_table
   WHERE user_2 = 22
   GROUP BY user_2)
LIMIT 1;

此查询改编自我在this excellent answer中找到的答案。

答案 3 :(得分:1)

这就是我得到的全部。

SELECT timestamp 
       FROM my_table 
       WHERE user_22 = '22' 
       ORDER BY timestamp DESC /*or ASC*/

当你查询它时,代码将是

while($row = mysql_fetch_array(the sql query)){
$timestamp = $row['timestamp']
}