SQLite: выберите X записей вокруг строки с определенным идентификатором в соответствии с оператором ORDER - PullRequest
1 голос
/ 02 мая 2011

Я знаю, что может выбрать следующую или предыдущую X-запись с такими утверждениями, как:

Next:     `SELECT * FROM table WHERE some_key > 3 ORDER BY some_key ASC  LIMIT X`
Previous: `SELECT * FROM table WHERE some_key < 3 ORDER BY some_key DESC LIMIT X`

Однако я работаю на языке, который возвращает курсор над результатами, и я хочу, чтобы все мои результаты были в одном курсоре.

Можно ли выбрать текущую запись вместе с X следующей и предыдущей записями в одном операторе SQL?

Ответы [ 2 ]

1 голос
/ 09 мая 2011

В итоге я использовал ответ от @mu, с некоторыми изменениями

В Android вы не можете использовать внутренние ORDER BY операторы в UNION, только один внешний ORDER BY во всем наборе. Чтобы обойти это, я использовал тот факт, что SQLite на Android поддерживает внутренние запросы, выполнил каждый фактический выбор во внутреннем запросе, а затем выделил все строки из внутреннего запроса для объединения следующим образом:

SELECT * FROM (SELECT * FROM table WHERE some_key > 3 ORDER BY some_key ASC LIMIT X)
UNION
SELECT * FROM table WHERE some_key = 3
UNION
SELECT * FROM (SELECT * FROM table WHERE some_key < 3 ORDER BY some_key DESC LIMIT X)
1 голос
/ 02 мая 2011

Вы можете попробовать использовать UNION:

SELECT * FROM table WHERE some_key > 3 ORDER BY some_key ASC  LIMIT X
UNION
SELECT * FROM table WHERE some_key = 3
UNION
SELECT * FROM table WHERE some_key < 3 ORDER BY some_key DESC LIMIT X

Возможно, вам придется исправить порядок за пределами профсоюзов, но приведенное выше даст вам окно вокруг some_key = 3, которое вы ищете, и онобудет чисто устранять пробелы в значениях some_key.

...