mysql 获取给定ID的最近行

mctunoxg  于 2023-02-28  发布在  Mysql
关注(0)|答案(7)|浏览(180)

在下表中,如何根据signin列只获取最近的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    |
+----+---------------------+---------+
o7jaxewo

o7jaxewo1#

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

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

要获取完整的单个记录,请对每个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
8fsztsew

8fsztsew2#

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

显而易见的索引应该在(id)上,或者multicolumn index(id, signin DESC)上。
为方便起见,MySQL将NULL值 * last * 按降序排序,这是您通常希望的NULL值的排序方式:具有最新非空signin的行。
首先获取NULL值:

ORDER BY signin IS NOT NULL, signin DESC

您可能希望向ORDER BY追加更多表达式,以便从(可能)具有NULL的多个行中获得确定性选取。
如果signin未定义为UNIQUE,则同样适用于没有NULL的情况。
相关:

SQL标准没有明确定义NULL值的默认排序顺序。不同RDBMS之间的行为差异很大。请参阅:

但是在SQL标准中定义了NULLS FIRST/NULLS LAST子句,大多数主流RDBMS都支持这些子句,但MySQL不支持。

  • SQL如何在升序排序时使空值排在最后
  • 按列ASC排序,但NULL值优先?
unguejic

unguejic3#

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

pwuypxnk4#

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

zpqajqem5#

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

7qhs6swi6#

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

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

mum43rcc7#

    • 轻松实现**

我知道这是个老问题你也可以这样做

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

在上图中,查询的第一条记录将是最近的记录。
对于唯一的记录,您可以使用类似于

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

以上查询只返回一条最新记录。
干杯!

相关问题