Dod*_*nas 24 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
Run Code Online (Sandbox Code Playgroud)
所以,我想做的是能够:
1) Select the "newest" row, based on timestamp AND
2) Select the 'user_2' column when given a value.
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西:
SELECT *
FROM my_table
WHERE user_2 = 22
AND timestamp = (
SELECT MAX( timestamp )
FROM my_table )
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
但这并没有返回我正在寻找的行.任何有关修复此查询的帮助都会很棒.
非常感谢.
ysh*_*vit 59
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
Run Code Online (Sandbox Code Playgroud)
编辑:
顺便说一句,如果你好奇为什么你的原始查询不起作用,让我们分解一下:
my_table
...中选择一些东西user_2
= 22timestamp
= (某个值,让我们暂时把它放在一边)现在,回到那个timestamp
值,它来自你的子查询:
SELECT MAX( timestamp ) FROM my_table
Run Code Online (Sandbox Code Playgroud)
请注意,此子查询不会基于以下内容限制任何行user_2
- 它会询问整个表中的最大时间戳.最大时间戳是上表中的第一个:(user_1 = 23,user_2 = 25,timestamp = 2012-08-10 22:00:00).
那么,让我们将其插回到顶级查询:
my_table
...中选择一些东西......你可以看到没有这样的一排.
如果某人在SQL Server中有类似的问题,这将对您有用(上一篇文章中建议的MySQL查询在SQL Server中不起作用):
SELECT * FROM my_table
WHERE timestamp = ( SELECT MAX( timestamp ) FROM my_table
WHERE user_2 = 22 )
Run Code Online (Sandbox Code Playgroud)
另一种方法是按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;
Run Code Online (Sandbox Code Playgroud)
这个查询改编自我在这个优秀答案中找到的答案。
归档时间: |
|
查看次数: |
63796 次 |
最近记录: |