Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite滚动光标如何使用重复名称正确滚动_Sql_Sqlite_Scroll_Cursor - Fatal编程技术网

Sqlite滚动光标如何使用重复名称正确滚动

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

我用SQLLite和C实现了一个滚动光标。 我只是在SQLLite工具中使用SQL进行测试

因此,我让它从以下位置运行滚动光标:

因此,我有这个工作,但结果是不正确的

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;