MySQL:获取最新记录

enc*_*nce 70 mysql sql

在下面的表格,我怎么得到公正的最新记录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    |
+----+---------------------+---------+
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 70

使用MAX(signin)按ID分组的聚合.这将列出signin每个最新的id.

SELECT 
 id, 
 MAX(signin) AS most_recent_signin
FROM tbl
GROUP BY id
Run Code Online (Sandbox Code Playgroud)

要获取整个单个记录,请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
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 70

SELECT *
FROM   tbl
WHERE  id = 1
ORDER  BY signin DESC
LIMIT  1;
Run Code Online (Sandbox Code Playgroud)

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

  • 这感觉就像最干净的方式! (5认同)

ran*_*tsh 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)
Run Code Online (Sandbox Code Playgroud)