MySQL:获取最新记录

时间:2011-12-15 16:30:14

标签: mysql sql

在下表中,如何根据登录栏而不是所有3条记录获得id=1最新记录

+----+---------------------+---------+
| 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    |
+----+---------------------+---------+

7 个答案:

答案 0 :(得分:66)

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

明显的索引位于(id)上,(id, signin DESC)上的multicolumn index

对于这种情况,MySQL方便地按降序排序NULL最后。如果可能有NULL值,那么这通常是您想要的:具有最新非空signin的行。

首先获取NULL值:

ORDER BY signin IS NOT NULL, signin DESC

相关:

SQL标准未明确定义NULL值的默认排序顺序。不同RDBMS的行为会有很大差异。参见:

SQL标准中定义的NULLS FIRST / NULLS LAST子句,并且受大多数主要RDBMS支持,但不受MySQL支持。参见:

答案 1 :(得分:65)

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

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

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

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

答案 2 :(得分:8)

在@ 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)

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

[Unit]
Description=Jenkins slave daemon
After=network.target

[Service]
User=jenkins
LimitNOFILE=100000
ExecStart=/usr/java/jdk1.8.0_112/bin/java -jar /var/lib/jenkins/swarm-client-3.3.jar -fsroot /var/lib/jenkins -username jenkins@jenkins.com -password * -name swarm -master http://jenkins.com -executors 1 -mode exclusive -labels swarm -disableSslVerification
ExecStop=/usr/bin/killall -w -s 2 java

[Install]
WantedBy=multi-user.target

答案 6 :(得分:0)

简单的实现方式

我知道这是一个老问题 您还可以执行

之类的操作
SELECT * FROM Table WHERE id=1 ORDER BY signin DESC

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

对于仅一条记录,您可以使用

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

以上查询将仅返回一条最新记录。

干杯!