【问题标题】:SQL sort with limit? (non trivial)SQL排序有限制? (不平凡)
【发布时间】:2010-10-28 20:22:50
【问题描述】:
table {
  id: long
  name: string
}

1235 Fred
1902 Trever
5123 George
6467 Derek
7868 Joe
8972 Bob
9272 Alf
9842 Hank

我想返回 Joes 之前的 2 条记录,按升序顺序。

即正确的值应该是:

5123 George
6467 Derek

有什么想法吗?仅供参考:

  1. 返回不正确的行:

    select * from table with id

  2. 返回错误的排序顺序:

    select * from table with id

【问题讨论】:

  • 使用的数据库是 SQLite - 但不要让这阻止你回答关于其他 RDBMS 的问题 - 无论如何我都会很高兴知道 :D

标签: java sql


【解决方案1】:
SELECT * FROM
  (select * from table where id<7868 order by id desc limit 2) AS foo
ORDER BY ID ASC

【讨论】:

  • 谢谢亚历克斯。令人惊讶的是,它也得到了 SQLite 的支持! :D
  • 啊,是的,SQLite 的嵌套选择是正确的(以及其他很多东西)——令人惊叹的小野兽,innit!-)
  • 确实是这样 - 尽管它解析但不强制执行外键约束让我感到困惑:)
  • 现在,当有一百万(或更多)行时试试这个,看看性能是否可以接受 - 特别是在 MySQL 上。
  • 在测试我的本地数据库副本(在 2 年的旧戴尔台式机上运行)具有超过 30 万条记录时,与常规排序(按 desc 的常规排序和此反向子查询)相比,差异可以忽略不计在 mysql 客户端中排序返回 0.00 秒)。无论如何它都不是一个好的基准,但我认为数据库引擎只需要对子查询返回的行进行额外的排序(即几乎没有)
【解决方案2】:

试试:

Select * from (
    select * from table with id<7868 
    order by id desc limit 2
) as t order by id asc

执行子查询让您首先获得正确的行,然后您可以重新排序它们

【讨论】:

    【解决方案3】:

    在 PostgreSQL 中:

    select * from "table" where id

    在 MySQL 中类似(我相信)“limit 2, 2”

    “LIMIT 2 OFFSET 2”也可以在 SQLite 中使用,至少在我尝试过的版本 (3.6.13) 中是这样

    【讨论】:

    • 虽然这在使用问题中给出的数据时会返回正确的结果,但我猜数据只是一个小而琐碎的例子。类似地,“SELECT * FROM table WHERE id IN (5123, 6467) ORDER BY id”给出了示例数据的正确结果,但在一般情况下是无用的。
    • 你好 araqnid。感谢您的回复。偏移量本身需要知道我们需要的结果的起始位置。虽然它适用于提供的数据,但它不够灵活,无法在我们不知道偏移量的情况下使用。例如,如果我需要 3 个结果,您需要将偏移量更改为 1。但感谢您的努力!
    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多