sqLite OFFSET查询不能与WHERE子句一起使用?

时间:2019-03-02 09:32:28

标签: sqlite where-clause offset sql-limit

有人可以解释为什么此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子句的成功查询:

no where clause

我们的测试表记录了大约102个阀门的循环,因此,如果限制为1000个,我们应该在查询的末尾至少显示9个条目。

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

1 个答案:

答案 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时,必须注意不能保证结果的准确性。