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
时,您必须知道不能保证结果是准确的。
谁能解释为什么这个 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
时,您必须知道不能保证结果是准确的。