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