MySQL:获取最新记录


80

在下表中,如何仅根据登录列获取的最新记录id=1而不是所有3条记录?

+----+---------------------+---------+
| id | signin              | signout |
+----+---------------------+---------+
|  1 | 2011-12-12 09:27:24 | NULL    |
|  1 | 2011-12-13 09:27:31 | NULL    |
|  1 | 2011-12-14 09:27:34 | NULL    |
|  2 | 2011-12-14 09:28:21 | NULL    |
+----+---------------------+---------+

Answers:


88

使用MAX(signin)按ID分组的汇总。这将列出signin每个最新的id

SELECT 
 id, 
 MAX(signin) AS most_recent_signin
FROM tbl
GROUP BY id

要获取整个单个记录,请INNER JOIN对子查询执行,该子查询仅返回MAX(signin)每个id。

SELECT 
  tbl.id,
  signin,
  signout
FROM tbl
  INNER JOIN (
    SELECT id, MAX(signin) AS maxsign FROM tbl GROUP BY id
  ) ms ON tbl.id = ms.id AND signin = maxsign
WHERE tbl.id=1

根据您的第一个答案,以下是SELECT id, MAX(signin) FROM tbl GROUP BY id WHERE id=1;
可行的方法

我尝试根据自己的情况实施第二个解决方案(以获取整个行),但我总是得到一个空结果集
rantsh 2013年

@rantsh xQbert的答案具有我上面最初所用版本的正确版本,但我更喜欢将其更改为其他版本的解决方案。
Michael Berkowski

@MichaelBerkowski您的意思是您更喜欢我的解决方案?如果是这种情况,我不介意在我的答案上
投票

1
@rantsh啊,我没有注意到您对我刚刚修改的内容添加了类似的内容,只是通过USING而不是explicit ON。您获得+1 :)
Michael Berkowski

82
SELECT *
FROM   tbl
WHERE  id = 1
ORDER  BY signin DESC
LIMIT  1;

最明显的指标是上(id),还是多列索引(id, signin DESC)

为方便起见,MySQL按降序对NULL值进行最后排序。如果有NULL值,那通常就是您想要的:具有最新not-null的行signin

首先获取NULL值:

ORDER BY signin IS NOT NULL, signin DESC

有关:

SQL标准未明确定义NULL值的默认排序顺序。行为在不同的RDBMS之间变化很大。看到:

但也有NULLS FIRST/NULLS LAST由MySQL大多数主要RDBMS在SQL标准定义,并支持条款,但没有。看到:


5
这感觉就像是最干净的方法!
karancan

考虑为登录列创建索引,这将大大加快该过程
Alexei Tenitski 2014年

使用SELECT TOP 1 *并删除LIMIT 1最后一行。如果使用SQL Server。如果使用MySQL或Postgres,请使用上面的代码。
jaredbaszler

最干净的。。。。。。。。
stigzler,

简单干净!
Jeremy Swagger

9

以@xQbert的答案为基础,您可以避免子查询并使其足够通用以按任何ID进行过滤

SELECT id, signin, signout
FROM dTable
INNER JOIN(
  SELECT id, MAX(signin) AS signin
  FROM dTable
  GROUP BY id
) AS t1 USING(id, signin)

嗨,这个查询如何工作,它比xQbert的答案有效吗?对我来说,这两个查询大约同时运行,我不理解查询的使用部分替换了通常的内容。
ZJS

3
Select [insert your fields here]
from tablename 
where signin = (select max(signin) from tablename where ID = 1)

1
SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id;

1

我有一个类似的问题。我需要获取页面内容翻译的最新版本,换句话说,就是获取该特定记录,该记录在“版本”列中编号最高。因此,我选择了按版本排序的所有记录,然后从结果中获取第一行(使用LIMIT子句)。

SELECT *
FROM `page_contents_translations`
ORDER BY version DESC
LIMIT 1

1

简单的实现方式

我知道这是一个老问题您也可以做类似的事情

SELECT * FROM Table WHERE id=1 ORDER BY signin DESC

在上面,查询第一条记录将是最新记录。

对于仅一张记录,您可以使用类似

SELECT top(1) * FROM Table WHERE id=1 ORDER BY signin DESC

上面的查询将仅返回一个最新记录。

干杯!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.