有人可以解释为什么此sqlite3查询将起作用并返回我的1000条记录:
SELECT * FROM fmsdata LIMIT 1000 OFFSET (SELECT COUNT(*) FROM fmsdata) - 1000
但是当我放到where子句WHERE valve=3
的那一刻,它什么都不返回?
SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET (SELECT COUNT(*) FROM fmsdata) - 1000
此子查询返回的表大小为123290。
SELECT COUNT(*) FROM fmsdata
仅供参考,因为我知道最新记录始终在末尾,所以偏移量只是为了快速为我提供数据库的尾端,而无需进行任何排序。
这是不带where子句的成功查询:
我们的测试表记录了大约102个阀门的循环,因此,如果限制为1000个,我们应该在查询的末尾至少显示9个条目。
不确定是否重要,但我使用的是Ubuntu 18.04系统。
答案 0 :(得分:3)
此查询:
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
这被翻译为:
从valve = 3的行中跳过第一个122290,然后显示给我 最多1000行。
在valve=3
处是否有超过122290行?
我不这么认为。这就是为什么你什么也得不到的原因。
我认为您真正想要的是:
SELECT * FROM fmsdata WHERE valve=3
LIMIT 1000
OFFSET (SELECT COUNT(*) FROM fmsdata WHERE valve=3) - 1000
这意味着,如果您有1100行,其中valve=3
,则将跳过前100行(= 1100-1000),而将选择其余的1000行。
如果您有1000行或更少的行,其中valve=3
将被选中。
作为旁注:
当您在不使用LIMIT
的情况下使用ORDER BY
时,必须注意不能保证结果的准确性。