MySQL:获取最新的logging

在下面的表格中,如何根据login列而不是全部3条logging得到最近id=1的logging?

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

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

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

要获得整个单个logging,对每个id仅返回MAX(signin)的子查询执行INNER JOIN

 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 * FROM tbl WHERE id = 1 ORDER BY signin DESC LIMIT 1; 

显而易见的索引是(id) ,或者是(id, signin DESC)上的多列索引 。

基于@ 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) 
 Select [insert your fields here] from tablename where signin = (select max(signin) from tablename where ID = 1) 
 SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id; 
  • 运行目录中的所有SQL文件
  • 将SQL数据从一个表移动到另一个表
  • MySQL – 在列中replace字符
  • 什么是MySQL的最佳varchar大小?
  • 无法添加或更新子行:外键约束失败
  • MySQL – select所有列WHERE一列是DISTINCT
  • 在SQL Server中分页结果的最佳方法是什么?
  • 为什么不爱SQL?
  • MyISAM和InnoDB有什么区别?
  • 在Django之外使用Django数据库层?
  • 为什么Magento在生成ID之后无法保存客户?