mysql - SQL SELECT 最后一个条目没有限制

标签 mysql sql postgresql limit

我有一个包含 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。

SQL Fiddle.

窗口函数

同样可以用 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 初始化变量。

SQL Fiddle.

关于mysql - SQL SELECT 最后一个条目没有限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117349/

相关文章:

mysql - postgresql 插入一个 null 转换为默认值?

mysql - Sql初学者如何将groupby转换为partition

sql - 为什么这个(不相关的)子查询会导致这样的问题?

SQL Server while 循环联合所有

postgresql - 试图从 laravel 中的日期获取月份(并且 postgres 提取物不起作用)

mysql - 无法选择表。*,因为它不存在,无法创建表,因为它存在

MySQL:多次搜索单个表?

python - 区分大小写的查询返回字符串而不是列表

node.js - 在 sequelizejs 中从搜索中排除用户

MySQL 和 PostgreSQL 引用字段名称之间的 PHP PDO 兼容性