在下表中,如何根据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 |
+----+---------------------+---------+
7条答案
按热度按时间o7jaxewo1#
使用按id分组的聚合
MAX(signin)
。这将列出每个id
的最新signin
。要获取完整的单个记录,请对每个id仅返回
MAX(signin)
的子查询执行INNER JOIN
。8fsztsew2#
显而易见的索引应该在
(id)
上,或者multicolumn index在(id, signin DESC)
上。为方便起见,MySQL将
NULL
值 * last * 按降序排序,这是您通常希望的NULL
值的排序方式:具有最新非空signin
的行。首先获取
NULL
值:您可能希望向
ORDER BY
追加更多表达式,以便从(可能)具有NULL
的多个行中获得确定性选取。如果
signin
未定义为UNIQUE
,则同样适用于没有NULL
的情况。相关:
SQL标准没有明确定义
NULL
值的默认排序顺序。不同RDBMS之间的行为差异很大。请参阅:但是在SQL标准中定义了
NULLS FIRST
/NULLS LAST
子句,大多数主流RDBMS都支持这些子句,但MySQL不支持。unguejic3#
在@xQbert的答案的基础上,您可以避免使用子查询,并使其足够通用以按任何ID进行过滤
pwuypxnk4#
zpqajqem5#
7qhs6swi6#
我也遇到过类似的问题。我需要得到页面内容翻译的最后一个版本,换句话说--得到版本列中编号最高的特定记录。所以我选择了所有按版本排序的记录,然后从结果中取出第一行(通过使用LIMIT子句)。
mum43rcc7#
我知道这是个老问题你也可以这样做
在上图中,查询的第一条记录将是最近的记录。
对于唯一的记录,您可以使用类似于
以上查询只返回一条最新记录。
干杯!