Выберите каждый n-й термин, включая первый, из базы данных sqlite

Я пытаюсь выбрать первую строку и каждую пятую после нее (это дает мне 4 запроса с уникальными строками), но я не уверен, что это правильно, поскольку мои результаты не такие, как ожидалось.

    //create the nth row selection
    int n = level + 5;

    //query the content resolver
    Cursor cursor = contentResolver.query(
            MainContentProvider.CONTENT_URI_ENGLISH,
            DatabaseOpenHelper.PROJECTION_ENGLISH,
            DatabaseOpenHelper.KEY_ROW_ID + " = " + (level+1) + " OR " + DatabaseOpenHelper.KEY_ROW_ID +" % " + n +" = 0",
            null,
            DatabaseOpenHelper.KEY_ROW_ID + " ASC"
    );

где level находится в интервале [0,3]. Результаты не соответствуют ожидаемому значению и в два раза меньше (приблизительно).


Как должен выглядеть мой метод запроса для выбора каждой пятой строки, начиная с первой?


person Danny Watts    schedule 11.03.2014    source источник


Ответы (2)


Вы можете добиться этого, используя такой запрос (хотя я не уверен в его производительности):

SELECT 
  id,
  name,
  (SELECT count(*) - 1 FROM my_table t_inner WHERE t.id >= t_inner.id) AS ordinal 
FROM my_table t
WHERE ordinal % 5 == 0
ORDER BY id ASC;

Или вы можете создать CursorWrapper, который вернет подмножество строк. Недостатком этого подхода является то, что вам придется извлекать каждую строку из базы данных, что может быть медленным, если у вас много данных.

person chalup    schedule 12.03.2014

(Предполагая, что идентификаторы строк являются последовательными) rowid % X = 0 выбирает каждую X строку, поэтому вы не должны изменять X.

Если вы не можете изменить этот термин, вы должны изменить другой. Либо примените смещение к значениям rowid ((rowid - offset) % X = 0), либо сравните с другим значением (rowid % X = offset), где offset находится в диапазоне от 0 до X-1.

Обратите внимание, что первое сравнение (rowid = level+1) не обязательно.

person CL.    schedule 12.03.2014