在下表中,如何根据登录栏而不是所有3条记录获得id=1
的最新记录?
+----+---------------------+---------+
| 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 |
+----+---------------------+---------+
答案 0 :(得分:66)
SELECT *
FROM tbl
WHERE id = 1
ORDER BY signin DESC
LIMIT 1;
明显的索引位于(id)
上,(id, signin DESC)
上的multicolumn index。
对于这种情况,MySQL方便地按降序排序NULL
值最后。如果可能有NULL
值,那么这通常是您想要的:具有最新非空signin
的行。
首先获取NULL
值:
ORDER BY signin IS NOT NULL, signin DESC
相关:
SQL标准未明确定义NULL
值的默认排序顺序。不同RDBMS的行为会有很大差异。参见:
但是 SQL标准中定义的NULLS FIRST
/ NULLS LAST
子句,并且受大多数主要RDBMS支持,但不受MySQL支持。参见:
答案 1 :(得分:65)
使用按ID分组的汇总MAX(signin)
。这将列出每个signin
的最新id
。
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
答案 2 :(得分:8)
在@ 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)
答案 3 :(得分:3)
Select [insert your fields here]
from tablename
where signin = (select max(signin) from tablename where ID = 1)
答案 4 :(得分:1)
SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id;
答案 5 :(得分:1)
我有类似的问题。我需要获取页面内容翻译的最后版本,换句话说 - 获取版本列中编号最高的特定记录。所以我选择按版本排序的所有记录,然后从结果中取第一行(使用LIMIT子句)。
[Unit]
Description=Jenkins slave daemon
After=network.target
[Service]
User=jenkins
LimitNOFILE=100000
ExecStart=/usr/java/jdk1.8.0_112/bin/java -jar /var/lib/jenkins/swarm-client-3.3.jar -fsroot /var/lib/jenkins -username jenkins@jenkins.com -password * -name swarm -master http://jenkins.com -executors 1 -mode exclusive -labels swarm -disableSslVerification
ExecStop=/usr/bin/killall -w -s 2 java
[Install]
WantedBy=multi-user.target
答案 6 :(得分:0)
简单的实现方式
我知道这是一个老问题 您还可以执行
之类的操作SELECT * FROM Table WHERE id=1 ORDER BY signin DESC
在上面,查询的第一条记录将是最新的记录。
对于仅一条记录,您可以使用
SELECT top(1) * FROM Table WHERE id=1 ORDER BY signin DESC
以上查询将仅返回一条最新记录。
干杯!