Итак, я знаю достаточно SQL, чтобы быть опасным, и не более того. Я разрабатываю приложение, которое должно отображать разделы данных из базы данных SQLite и иметь возможность перебирать некоторые данные на основе определенных критериев.
Итак, у меня есть таблица, которая выглядит так:
create table packets( id INTEGER PRIMARY KEY, timestamp varchar(32), type varchar(32), source varchar(32), destination varchar(32), channel varchar(16), first_sequence integer, last_sequence integer, missing integer );
Тогда у меня есть представление, которое отображает некоторые или все данные, основанные на определенных критериях.
Мы говорим о таблице с миллионами строк, поэтому я не могу загрузить все это в память. Итак, у меня есть класс представления, который запрашивает каждый элемент в отдельности на основе индекса в представлении.
Так, например, если я отображаю все пакеты, которые имеют значение канала 'C', и представление готово нарисовать первый элемент, я бы выполнил этот запрос к базе данных:
SELECT * FROM packets WHERE channel='C' LIMIT 1 OFFSET 0
Когда он готов нарисовать второй предмет, я делаю
SELECT * FROM packets WHERE channel='C' LIMIT 1 OFFSET 1
и т.д ...
Это отлично работает. Я понимаю, что это, вероятно, не самый оптимальный способ сделать это, но я просто пытаюсь научиться делать это самым простым способом с SQLite, а потом беспокоиться об оптимизации позже.
Теперь проблема в том, что мне нужно иметь возможность находить элементы в этом наборе результатов на основе других критериев поиска и получать индекс в исходном наборе результатов.
Например, мне нужно иметь возможность выполнять итерации по элементам в исходном наборе результатов, который имеет «пропущенное» значение 1, и вычислять индекс представления этих элементов.
Если я использую весь набор данных в таблице, я думаю, что могу сделать это с помощью чего-то подобного:
SELECT rowid FROM packets WHERE rowid > [currentlySelectedRowID] AND missing=1 LIMIT 1
Но когда мне нужен индекс в подмножестве данных, rowid на самом деле мне не помогает, и я понятия не имею, как найти индекс в подмножестве, не просматривая все элементы по отдельности самостоятельно.
Буду очень признателен за любые идеи о том, как сделать это с помощью SQL-запроса, или указатели на соответствующую документацию или учебные пособия.
Спасибо!
(примечание: вопрос может не иметь смысла, так как он немного запутан в моих мыслях о том, как это объяснить, поэтому, если что-то не понятно, я попытаюсь уточнить.)
Edit: на самом деле я обнаружил, что делать это в коде C достаточно с точки зрения производительности, выполняя запрос всего набора результатов после начального индекса, выполняя LIMIT -1 OFFSET [startIndex], а затем пошагово продвигаясь, пока не найду следующее отсутствует пункт. Тем не менее, было бы неплохо узнать, есть ли способ сделать это только с помощью оператора SQL, для дальнейшего использования.