Sqlite滚动光标如何使用重复名称正确滚动
我用SQLLite和C实现了一个滚动光标。 我只是在SQLLite工具中使用SQL进行测试 因此,我让它从以下位置运行滚动光标: 因此,我有这个工作,但结果是不正确的Sqlite滚动光标如何使用重复名称正确滚动,sql,sqlite,scroll,cursor,Sql,Sqlite,Scroll,Cursor,我用SQLLite和C实现了一个滚动光标。 我只是在SQLLite工具中使用SQL进行测试 因此,我让它从以下位置运行滚动光标: 因此,我有这个工作,但结果是不正确的 SELECT title FROM tracks WHERE singer='Madonna' AND title>:lasttitle ORDER BY title LIMIT 5; 假设这些是我的轨迹表中的字段: 跟踪id 歌手 标题 媒体格式 说我有一堆唱片() 4mad
SELECT title FROM tracks
WHERE singer='Madonna'
AND title>:lasttitle
ORDER BY title
LIMIT 5;
假设这些是我的轨迹表中的字段:
跟踪id
歌手
标题
媒体格式
说我有一堆唱片()
4madonna.mp3
2麦当娜
7麦当娜
1麦当娜,阿迪
5麦当娜
11麦当娜
3麦当娜
8麦当娜
10麦当娜
9麦当娜
6麦当娜
所以基本上我有无限的相同标题的记录,只要媒体格式不同,媒体格式就会使它们独一无二
记录是按标题排序的(如您在查询中所看到的),因此唯一id不符合顺序
当向前滚动以获取最后一个标题所在的下5条记录时,如何进行滚动光标
假设我已经将第一页加载到我的C#app中,然后在lastitle变量中向前滚动
它不会给我正确的记录。
因此,如果我将大于>更改为大于或等于>=则它将给我5条记录,从第一次出现的开始,但我需要它从记录6开始
我需要看到:
第1页
4 Madonna <All my love demo> .mp3
2 Madonna <Be cool demo> .wav
7 Madonna <Like a Virgin> .aaf
1 Madonna <Like a Virgin> .adi
5 Madonna <Like a Virgin> .mp4
4madonna.mp3
2麦当娜
7麦当娜
1麦当娜,阿迪
5麦当娜
第2页
11 Madonna <Like a Virgin> .wmv
3 Madonna <Like a Virgin> .mp5
8 Madonna <Like a Virgin> .mp6
10 Madonna <Like a Virgin> .mp7
9 Madonna <Like a Virgin> .mp8
11麦当娜.wmv
3麦当娜
8麦当娜
10麦当娜
9麦当娜
您的记录必须完全有序
如果WHERE筛选器中的列(此处:singer
/title
)可以标识多个记录,则必须添加其他列以使筛选器唯一。
在您的情况下,这可能是media\u格式
,但如果您的程序不知道可以使用其他列,则应该只使用主键(track\u id
或rowid
)
如果按多列排序,WHERE表达式将变得更复杂。
以下表为例,按X
和Y
排序:
X Y
- -
A 1
A 2 <- last record on previous page
A 3
B 1
B 2
在您的示例中,这将是:
SELECT *
FROM tracks
WHERE singer = 'Madonna'
AND ((title = :lasttitle AND media_format > :lastformat) OR
title > :lasttitle)
ORDER BY title, media_format
LIMIT ...
SQLite 3.15中新的行值特性有助于使查询语法更清晰(请参阅)。您仍然需要确保ORDER BY为每行提供唯一的结果,并且需要为快速结果创建适当的索引 您的初始查询看起来基本相同:
SELECT * FROM tracks
WHERE singer = 'Madonna'
ORDER BY title,media_format,track_id
LIMIT 5;
存储标题、媒体格式、最后结果行的曲目id。然后为您的下一次查询提供它(这里是?1、?2、?3):
这使得查询更容易阅读。使用
title+media\u format>:lasttitle
。显然,您必须在C代码的lasttitle变量中存储title+media_格式
SELECT *
FROM tracks
WHERE singer = 'Madonna'
AND ((title = :lasttitle AND media_format > :lastformat) OR
title > :lasttitle)
ORDER BY title, media_format
LIMIT ...
SELECT * FROM tracks
WHERE singer = 'Madonna'
ORDER BY title,media_format,track_id
LIMIT 5;
SELECT * FROM tracks
WHERE singer = 'Madonna'
AND (title,media_format,track_id) > (?1,?2,?3)
ORDER BY title,media_format,track_id
LIMIT 5;