c# - 使用c#在sqlite表中分页

标签 c# sql sqlite

我正在尝试翻阅此表,因此我最终得到了此查询(该查询不起作用)。

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/

相关文章:

java - 自定义 CursorAdapter 中出现 "Finalizing Cursor"错误的问题

ios - 在 Blob 字段 FMDB 中保存图像

c# - 当我将 XNA 游戏窗口的垂直尺寸更改为最小时,它会为 spritebatch 抛出 ObjectDisposedException,为什么?

c# - 如何配置自包含的单文件程序?

c# - 非 UI 线程上的 WPF 调度程序

c# - 这个语法有什么作用?如果(obj 是 SomeType obj2)

mysql - SQL中基于不同日期字段的比率计算

sql - 如何限制 oracle number(10) 数据类型的最大值为 2147483647

Java JDBC 如何使用 RETURNING 语句处理更新查询

python - 错误! C :\file\example. db 不是 UTF-8 编码的 ipython 笔记本