Ich habe eine Datenbank in meiner Android-Anwendung gespeichert und möchte die letzten 10 in die Datenbank eingefügten Nachrichten abrufen.
Wenn ich benutze:
Select * from tblmessage DESC limit 10;
es gibt mir die 10 nachrichten aber vonTOP. Aber ich möchte dieLETZTEN10 Nachrichten. Ist es möglich?
Angenommen, die gesamten Tabellendaten sind -
1,2,3,4,5....30
Ich habe die Abfrage select * from tblmessage where timestamp desc limit 10
geschrieben.
Es zeigt 30,29,28...21
Aber ich möchte die Sequenz als - 21,22,23...30
Ändern Sie den DESC in ASC, und Sie erhalten die gewünschten Datensätze. Wenn Sie sie jedoch geordnet benötigen, müssen Sie die Reihenfolge in der Reihenfolge ändern, in der sie eingehen. Sie können dies entweder in Ihrem eigenen Code tun oder Ihre Abfrage einfach erweitern so:
select * from (select * from tblmessage order by sortfield ASC limit 10) order by sortfield DESC;
Sie sollten immer eine order by-Klausel angeben, nicht nur ASC oder DESC.
in großen Datenbanken kann die ORDER BY DESC
-Anweisung das System wirklich verlangsamen, z. Himbeer-Pi. Ein guter Ansatz, um ORDER BY
zu vermeiden, ist der Befehl OFFSET
. Und Sie behalten sogar die gespeicherte Bestellung bei:
SELECT * FROM mytable LIMIT 10 OFFSET (SELECT COUNT(*) FROM mytable)-10;
siehe: http://www.sqlite.org/lang_select.html
Überprüfen Sie Ihre Leistung mit:
.timer ON
Leicht verbesserte Antwort:
select * from (select * from tblmessage order by sortfield DESC limit 10) order by sortfield ASC;
Michael Dillon hatte die richtige Idee in seine Antwort , aber das Beispiel gibt die ersten paar Reihen in umgekehrter Reihenfolge:
select * ... (select * ... ASC limit 10) ... DESC
Er wollte das Letzte, es sollte sein:
select * ... (select * ... DESC limit 10) ... ASC
Wenn Ihre Tabelle eine Spalte mit Autoincrement des Primärschlüssels enthält (z. B. einige "row_id"), benötigen Sie nur eine Einzelauswahl mit DESC-Reihenfolge in dieser Spalte
Raw Anfrage sieht aus wie
select * from table_name order by row_id DESC limit 10
Android-Implementierung ist
private Cursor queryLastEvents() {
return getDatabase().query("table_name", null, null, null, null, null, "row_id DESC", "10");
}
Versuche dies,
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();
}
}
Rufen Sie dann die letzten 10 Daten ab.
select * from
(select * from table_name order by yourfield ASC limit 10)
order by yourfield DESC;
Es gibt keine besseren Lösungen als diese.
In Ihrer Abfrage wird die Variable DESC
als Tabellenalias interpretiert.
Wie von ρяσѕρєя K erwähnt, müssen Sie, um eine Sortierrichtung angeben zu können, zuerst mit einer ORDER BY
-Klausel sortiert werden.
Die zu sortierende Spalte sollte ein Zeitstempel sein, wenn Sie einen haben, oder eine Spalte mit automatischer Inkrementierung wie der Primärschlüssel der Tabelle.
cursor.moveToLast();
while (cursor.moveToPrevious()){
//do something
}
mit der gleichen Abfrage: select * aus tblmessage, wobei der Zeitstempel absteigt