【问题标题】:paging in sqlite table using c#使用c#在sqlite表中分页
【发布时间】:2014-08-10 14:38:44
【问题描述】:

我正在尝试翻阅这个表,所以我最终得到了这个查询(它不起作用)。

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,但这是我唯一想到的获取 First 和 Last 值的方法。

如何高效地在这个表中分页?

【问题讨论】:

  • 这个查询没有意义。您打算在第一页和下一页上为 {0}{1} 使用什么值?
  • 0 和一个表示最大 int 值的值
  • 第一个和最后一个值是第一个和最后一个返回行中的值。

标签: c# sql sqlite


【解决方案1】:

您的查询不起作用,因为 SQL 中的 Min(Column)Max(Column) 返回所有行的评估(聚合),因此不知道问题中非聚合查询中每一行的值。

如果您确实需要最小值和最大值,您可以在单独的选择语句中返回它们,这样您的数据集就有 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}page number * page size

很抱歉,如果这不能回答您的问题,目前尚不清楚您想要 FIRST 和 LAST 做什么。页码和大小通常由 UI 跟踪。另外,我还没有在 SQLite 中测试过上述内容。

注意

如果您使用String.Format() 之类的东西来构建查询,那么您在上面发布的代码看起来容易受到SQL injection 的攻击。考虑改变这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 2013-06-24
    • 2016-12-27
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多