MySQL按最新时间戳选择

rbpvctlc  于 2023-08-02  发布在  Mysql
关注(0)|答案(5)|浏览(125)

我在SO上看到过一些类似的问题,但是,我还没有找到解决我的具体问题的方法。(仅供参考,这些不是我真实的的专栏,只是一个简短的例子)。
我有一个基本的表my_table
| 用户_2|时间戳|注解(不是表格的一部分)| note(not part of table) |
| --|--|--| ------------ |
| 二十五|2012-08-10 22:00:00|||
| 二十二|2012-08-10 19:00:00| <===我想返回此行| <=== I would like to return this row |
| 二十二|2012-08-10 17:00:00|||
| 十七个|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


但这并没有返回我正在寻找的行。任何帮助修复此查询将是伟大的。
非常感谢。

bksxznpy

bksxznpy1#

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 = (某个值,我们先把它放在一边)
  • 限制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
    *2012-08-10 22:00:00
  • 限制1

你可以看到没有这样的争吵。

ryevplcw

ryevplcw2#

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

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

字符串

6mw9ycah

6mw9ycah3#

另一种方法是在计算MAX(timestamp)GROUP BYuser_2列。这样做将使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中找到的答案。

smdncfj3

smdncfj34#

这是我的全部。

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']
}

wn9m85ua

wn9m85ua5#

以下是我找到的解决这个问题的方法:

SELECT *
 FROM my_table AS t1
 WHERE user_2 = 22
 AND timestamp = (
 SELECT MAX( timestamp )
 FROM my_table AS t2
 WHERE t1.user_2 = t2.user_2 );

字符串
如果您想查看每个唯一用户的最新时间戳,只需删除WHERE user_2 = 22即可。

相关问题