我有一个包含 3 个字段的表:
id
note
created_at
在 SQL 语言中,尤其是 Postgres 中,有没有一种方法可以让我选择最后一个 note
的值,而不必 LIMIT 1
?
普通查询:
select note from table order by created_at desc limit 1
我对避免限制的东西很感兴趣,因为我需要它作为子查询。
最佳答案
带有EXISTS semi-join的简单版本:
SELECT note FROM tbl t
WHERE NOT EXISTS
(SELECT 1 FROM tbl t1 WHERE t1.created_at > t.created_at);
“找到一个后来没有创建其他笔记的笔记。”
如果 created_at
不是 UNIQUE
,它可以返回 多行,这与 @Hogan 版本的弱点相同 - 正如 @Ollie 已经指出的那样.与@Hogan 的查询(max()
仅针对简单类型定义)不同,此查询可以轻松改进:
比较行类型
SELECT note FROM tbl t
WHERE NOT EXISTS
(SELECT 1 FROM tbl t1
WHERE <b>(t1.created_at, t1.id) > (t.created_at, t.id)</b>);
假设您想要最大的 id
以防与 created_at
并列,并且 id
是主键,因此是唯一的。这适用于 PostgreSQL 和 MySQL。
窗口函数
同样可以用 window function 实现在 PostgreSQL 中:
SELECT note
FROM (
SELECT note, row_number() OVER (ORDER BY created_at DESC, id DESC) AS rn
FROM tbl t
) x
WHERE rn = 1;
MySQL 不支持窗口函数。您可以用这样的变量替换:
SELECT note
FROM (
SELECT note, @rownum := @rownum + 1 AS rn
FROM tbl t
,(SELECT @rownum := 0) r
ORDER BY created_at DESC, id DESC
) x
WHERE rn = 1;
(SELECT @rownum := 0) r
在没有显式 SET
命令的情况下用 0 初始化变量。
关于mysql - SQL SELECT 最后一个条目没有限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117349/