37

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

我有一个基本表 my_table

用户_1 用户_2 时间戳 注意(不是表格的一部分)
23 25 2012-08-10 22:00:00
24 22 2012-08-10 19:00:00 <=== 我想返回这一行
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

4 回答 4

77
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

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

于 2012-08-11T05:38:19.810 回答
5

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

SELECT * FROM my_table 
WHERE    timestamp =  ( SELECT MAX( timestamp ) FROM my_table 
                        WHERE user_2 = 22 )
于 2014-04-25T02:33:09.390 回答
4

另一种方法是GROUP BYuser_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;

此查询改编自我在此出色答案中找到的答案

于 2015-03-11T22:19:14.160 回答
0

这就是我所得到的。

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']
}
于 2012-08-11T05:45:37.917 回答