使用c#在sqlite表中进行分页

问题描述 投票:1回答:1

我正试图翻阅这个表,所以我最终得到了这个查询(这是不行的)。

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,最后用于移动到下一页/上一页。

我也创建了这个索引:

CREATE INDEX idx1 ON user_table (user_uid);

请注意:我看到了this answer,但这是我想要获得First和Last值的唯一方法。

如何有效地在此表中页面?

c# sql sqlite
1个回答
1
投票

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

如果你真的需要min和max,你可以在单独的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}page number * page size

对不起,如果这不能回答你的问题,那么你不清楚你想要的第一个和最后一个。 UI的页码和大小通常会被跟踪。另外,我还没有在SQLite中测试过上述内容。

Note

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

© www.soinside.com 2019 - 2024. All rights reserved.