2012-12-24 19 views
17

Mam bazę danych zapisaną w mojej aplikacji Android i chcę pobrać 10 ostatnich wiadomości wstawionych do DB.Kwerenda SQLite Android - Pierwsze 10 rekordów

Gdy używam:

Select * from tblmessage DESC limit 10; 

daje mi komunikaty o 10 ale z TOP. Ale chcę, żeby wiadomości były wyświetlane. Czy to możliwe?

Załóżmy cały dane tabela -

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

Napisałem zapytanie select * from tblmessage where timestamp desc limit 10

To pokazuje 30,29,28...21

Ale chcę sekwencję jako - 21,22,23...30

+8

trzeba będzie zmienić zapytanie za pomocą ORDER BY jako 'select * from tblmessage ORDER BY DESC LIMIT _id 10' –

+0

Domyślam się, że mój stół nie tworzy żadnej kolumny _id. – Darpan

Odpowiedz

30

Zmień DESC na ASC, a otrzymasz żądane rekordy, ale jeśli ich potrzebujesz, musisz zmienić ich kolejność. Możesz to zrobić we własnym kodzie lub po prostu rozszerzyć zapytanie tak:

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

Powinieneś zawsze określić zamówienie przez klauzuli, nie tylko ASC lub DSC.

+0

Chcę odwrócić kolejność, w jakiej się znajdują. Jak mogę> –

+1

przypuszczać, że cała tabela danych jest - 1,2,3,4,5 ... 30 Napisałem zapytanie wybierz * z tblmessage, gdzie timestamp desc limit 10 Pokazuje 30,29,28 ... 21 Ale chcę sekwencji jako - 21,22,23 ... 30 Jak mogę uzyskać ten sam –

+1

Awesome! Nie wiedziałem, że możesz zagnieździć wybrane tak. –

1

Spróbuj tego,

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(); 
    } 
} 

Następnie pobierz 10 ostatnich danych.

0

W zapytaniu DESC jest interpretowany jako alias tabeli.

Jak wspomniano przez ρяσρί K, aby móc określić kierunek sortowania, należy najpierw uporządkować klauzulę ORDER BY.

Kolumna, która ma być posortowana, powinna być znacznikiem czasu, jeśli go posiadasz lub kolumną z automatyczną inkrementacją, taką jak klucz podstawowy tabeli.

20

na dużych bazach danych, instrukcja ORDER BY DESC naprawdę może spowolnić działanie systemu, np. raspberry pi. Miłym sposobem uniknięcia polecenia ORDER BY jest polecenie OFFSET.A ty nawet utrzymać przechowywane zamówienie:

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

patrz: http://www.sqlite.org/lang_select.html

Sprawdź swoje osiągi przy:

.timer ON 
+0

Istnieje szansa, że ​​offset może być ujemny, co może podnieść wyjątek. – Atul

+0

Oczywiście można nazwać wartości z górnej i dolnej granicy. Jednak sqlite nie generuje wyjątku, ale zwraca wszystkie możliwe wartości. – McPeppr

+0

Użyłem tej opcji i działa tak, jak chcę. Jest nadal bezpieczny z wartościami ujemnymi. –

5

Nieco lepszą odpowiedź:

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

Michael Dillon miał dobry pomysł w his answer, ale przykład podaje kilka pierwszych wierszy, inve rted zamówienie:

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

Chciał ostatni, powinno być:

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

tak - wybierz * ... (wybierz * ... Limit DESC 10) ... ASC –

1

Jeśli tabela zawiera kolumny z pierwotnej autoIncrement kluczowego (niektóre „ROW_ID” na przykład), to wystarczy pojedynczy wybierz z rzędu DESC według tej kolumny

Raw prośba wygląda

select * from table_name order by row_id DESC limit 10 

Android Impl ementation jest

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

Daje to ostatnie 10 rekordów, ale w kolejności ODWRÓCONEJ. – Atul

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

Nie można mieć lepsze rozwiązania niż to.

+0

świetne rozwiązanie .. – rs11

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

z tego samego zapytania: select * from tblmessage gdzie datownik desc limitu 10

+0

Kilka uwag na temat, dlaczego jest to właściwa odpowiedź, może pomóc osobie zadającej pytanie – joanolo

+0

Mam również ten sam typ problemu w aplikacji do czatowania., Ale robię to zrobić to cursor.moveToLast(); while (cursor.moveToPrevious()) { // zrobienie czegoś } –