2

我有一张这样的桌子

+------------+
| Id| data   |
|============|
| n | some_n |
| a | some_a |
| f | some_f |
| b | some_b |
+------------+

如果我只知道上一个 ID 行,有没有办法获得下一个“N”行?例如,我知道第二行 (a) 的 id,我想从那里获取接下来的 2 行。查询将返回 {(f, some_f), (b, some_b)}

查询看起来像这样:

SELECT * FROM table WHERE [something] LIMIT start,numRows;

问题是......我如何知道起始值?我在where子句中放了什么?

4

1 回答 1

2
SELECT t.* FROM table t WHERE t.Id > 'a' ORDER BY t.Id LIMIT 2;

表中的行没有隐含的顺序;所以没有 ORDER BY 子句,数据库可以自由地以任意顺序返回行。如果没有 ORDER BY,则无法保证后续查询不会返回先前返回的行。

因此,让您知道“第二行”的 Id 值为'a',这意味着已应用了一些排序。我的示例查询假定行按 Id 列排序。

使用指定的顺序,查询可以使用谓词(WHERE 子句中的条件)返回“下一个 N”行,该谓词指定只返回“跟随”最后一个检索值的行。LIMIT 子句在行排序后应用,因此我们可以保证获得“下 N 行”(按有序顺序)。

更一般的形式,如果行的排序不是唯一键,则需要稍微复杂的谓词来处理相等条件,其中要检索的下一行具有与最后检索的匹配的值...

SELECT t.*
  FROM table t
 WHERE ( t.col = last_col_value_retrieved AND t.id > last_id_value_retrieved )
    OR ( t.col > last_col_value_retrieved )
 ORDER BY t.col, t.id
 LIMIT 50
于 2013-06-06T06:54:31.317 回答