Android SQLite Query - получение последних 10 записей

У меня есть база данных, сохраненная в приложении для Android, и я хочу получить последние 10 сообщений, вставленных в БД.

Когда я использую:

Select * from tblmessage DESC limit 10;

он дает мне 10 сообщений, но из TOP. Но я хочу LAST 10 сообщений. Возможно ли это?

Предположим, что все данные таблицы -

1,2,3,4,5....30

Я написал запрос select * from tblmessage where timestamp desc limit 10

Он показывает 30,29,28...21

Но я хочу, чтобы последовательность была как - 21,22,23...30

Ответ 1

Измените DESC на ASC, и вы получите нужные записи, но если вам нужно их заказать, вам нужно будет отменить порядок, в котором они входят. Вы можете либо сделать это в своем собственном коде, либо просто расширить ваш запрос:

select * from (select * from tblmessage order by sortfield ASC limit 10) order by sortfield DESC;

Вы действительно должны всегда указывать предложение order by, а не только ASC или DESC.

Ответ 2

в больших базах данных оператор ORDER BY DESC действительно может замедлить работу системы, например. Raspberry Pi. Хорошим подходом, чтобы избежать ORDER BY является команда OFFSET. И вы даже сохраняете сохраненный порядок:

SELECT * FROM mytable LIMIT 10 OFFSET (SELECT COUNT(*) FROM mytable)-10;

см. http://www.sqlite.org/lang_select.html

проверьте свою производительность с помощью:

.timer ON

Ответ 3

Немного улучшенный ответ:

select * from (select * from tblmessage order by sortfield DESC limit 10) order by sortfield ASC;

Майкл Диллон имел правильную идею в его ответе, но в примере приведены первые несколько строк, инвертированный порядок:

select * ... (select * ... ASC limit 10) ... DESC

Он хотел последнего, это должно быть:

select * ... (select * ... DESC limit 10) ... ASC

Ответ 4

Попробуйте это,

SQLiteDatabase database = getReadableDatabase();
Cursor c=database.rawQuery("sql Query", null);
if(c.moveToFirst) {
    int curSize=c.getCount()  // return no of rows
    if(curSize>10) {
       int lastTenValue=curSize -10;
       for(int i=0;i<lastTenValue;i++){
          c.moveToNext();
       }
    } else {
       c.moveToFirst();
    }
}

Затем извлеките последние 10 данных.

Ответ 5

Если ваша таблица содержит столбец с автоинкрементным ключом (например, "row_id" ), вам просто нужен одиночный выбор с порядком DESC в этом столбце

Необработанный запрос выглядит как

select * from table_name order by row_id DESC limit 10

Реализация Android -

private Cursor queryLastEvents() {
    return getDatabase().query("table_name", null, null, null, null, null, "row_id DESC", "10");
}

Ответ 6

В вашем запросе DESC интерпретируется как псевдоним таблицы.

Как упоминалось ρяσѕρєя K, чтобы указать направление сортировки, вам нужно сначала отсортировать с помощью предложения ORDER BY.

Столбец, который нужно отсортировать, должен быть отметкой времени, если он у вас есть, или столбец с автоинкрементцией, такой как первичный ключ таблицы.

Ответ 7

select * from
(select * from table_name order by yourfield ASC limit 10)
order by yourfield DESC;

У вас не может быть лучшего решения, чем это.

Ответ 8

cursor.moveToLast();
while (cursor.moveToPrevious()){
       //do something
}

с тем же запросом: выберите * из tblmessage, где timestamp desc limit 10