我有一张这样的表
+------------+
| Id| data |
|============|
| n | some_n |
| a | some_a |
| f | some_f |
| b | some_b |
+------------+
如果我只知道上一个ID行,有没有办法获得下一个“N”行?例如,我知道第二行(a)的id,我想从那里获得下一行。查询将返回{(f,some_f),(b,some_b)}
查询看起来像这样:
SELECT * FROM table WHERE [something] LIMIT start,numRows;
问题是......如何知道起始值?我在where子句中放了什么?
答案 0 :(得分: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