2011-12-15 117 views
44

在下表中,我如何根据登录列而不是全部3条记录得到最新记录id=1MySQL:获取最近的记录

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

回答

53

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

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

下面是根据您的** **第一次回答什么工作:`选择ID,MAX(登入)FROM TBL GROUP BY ID其中,ID = 1;` – enchance 2011-12-15 17:18:12

+0

我试图执行第二个解决方案(以获得整行)对我自己的情况,但我总是得到一个空的结果集 – rantsh 2013-03-13 16:34:45

+1

@rantsh因为这是不正确的!我已经在上面纠正了它。 – 2013-03-13 16:40:40

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

明显的指数将是对(id),或上一个(id, signin DESC)multicolumn index。对@ xQbert的答案的

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

大厦,你能避免子查询,使它足够通用以任何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) 
1
SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id; 
0

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

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