sqlite OFFSET 查询不适用于 WHERE 子句?

sqLite OFFSET query does not work with WHERE clause?

谁能解释为什么这个 sqlite3 查询会起作用,return 我的 1000 条记录:

SELECT * FROM fmsdata LIMIT 1000 OFFSET (SELECT COUNT(*) FROM fmsdata) - 1000

但是当我放入 where 子句时 WHERE valve=3 它 return 什么都没有?

SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET (SELECT COUNT(*) FROM fmsdata) - 1000

此子查询 return 的 table 大小为 123290。

SELECT COUNT(*) FROM fmsdata

仅供参考,偏移量只是为了快速给我数据库的尾端而不必对任何内容进行排序,因为我知道最新的记录总是在最后。

这是一个没有 where 子句的成功查询:

我们的测试 table 有大约 102 个阀门循环的记录,因此在限制为 1000 的情况下,我们应该至少有 9 个条目出现在查询的末尾。

不确定这是否重要,但我使用的是 Ubuntu 18.04 系统。

这个查询:

SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET (SELECT COUNT(*) FROM fmsdata) - 1000

根据您的数据,相当于:

SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET 123290 - 1000

SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET 122290

这被翻译成:

From the rows where valve=3, skip the first 122290 and then show me maximum 1000 rows.

你有超过 122290 行 valve=3 吗?
我不这么认为。这就是为什么你什么都得不到的原因。
我想你真正想要的是这个:

SELECT * FROM fmsdata WHERE valve=3 
LIMIT 1000 
OFFSET (SELECT COUNT(*) FROM fmsdata WHERE valve=3) - 1000

这意味着如果您有 1100 行 valve=3,前 100 行(= 1100 - 1000)将被跳过,其余 1000 行将被选中。
如果 valve=3 的行数不超过 1000 行,则将选择所有这些行。
旁注
当您使用 LIMIT 而不使用 ORDER BY 时,您必须知道不能保证结果是准确的。