it-roy-ru.com

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

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

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

Select * from tblmessage DESC limit 10;

он дает мне 10 сообщений, но изTOP. Но я хочуПОСЛЕДНИЙ10 сообщений. Является ли это возможным?

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

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

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

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

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

20
Gaurav Arora

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

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

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

33
Michael Dillon

в больших базах данных оператор 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
25
McPeppr

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

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
6
moodboom

Если ваша таблица содержит столбец с автоинкрементом первичного ключа (например, «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");
}
1
voronnenok

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

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 данных.

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

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

0
rs11

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

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

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

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

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

0
Mąñîşh Şhârmá Mkş