我正在尝试翻阅此表,因此我最终得到了此查询(该查询不起作用)。
SELECT MIN(user_uid) AS FIRST,
MAX(user_uid) AS LAST,
user_number, user_name
FROM user_table
WHERE user_uid > MAX(FIRST,{0}) AND user_uid < MIN(LAST,{1})
AND ( user_name LIKE '%{2}%' OR user_number LIKE '%{3}%' )
AND user_category={4} OR user_category={5}
ORDER BY user_uid LIMIT {6}
我从我的 C# 变量中获取参数值。我将 FIRST、LAST 存储在外部,以便使用它们移动到下一页/上一页。
我也创建了这个索引:
CREATE INDEX idx1 ON user_table (user_uid);
请注意:我看到this answer ,但这是我想获得第一个和最后一个值的唯一方法。
如何高效地对该表进行分页?
最佳答案
您的查询不起作用,因为 SQL 中的 Min(Column)
和 Max(Column)
返回所有行的评估(聚合),因此不知道什么您的问题中非聚合查询中每一行的值。
如果您确实需要最小值和最大值,您可以在单独的 select 语句中返回它们,这样您的数据集就有 3 个表(如果您使用的是 ADO)。
但是分页通常应该实现using offset如下例所示(请注意,order by 应该使查询具有确定性,以便每次都返回相同的结果)。
SELECT
user_number,
user_name
FROM user_table
WHERE ( user_name LIKE '%{1}%' OR user_number LIKE '%{2}%' )
AND user_category={3} OR user_category={4}
ORDER BY user_uid LIMIT {5} OFFSET {6}
其中 {5}
是页面大小,{6}
是页码 * 页面大小
。
抱歉,如果这不能回答您的问题,则不清楚您想要 FIRST 和 LAST 的目的。页码和大小通常由 UI 跟踪。另外,我还没有在 SQLite 中测试上述内容。
注意
您在上面发布的代码看起来很容易受到 SQL injection 的攻击。如果您使用 String.Format()
之类的东西来构建查询。考虑改变这一点。
关于c# - 使用c#在sqlite表中分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229655/