J'ai une base de données enregistrée dans mon application Android et je souhaite récupérer les 10 derniers messages insérés dans la base de données.
Quand j'utilise:
Select * from tblmessage DESC limit 10;
il me donne les 10 messages mais à partir duTOP. Mais je veux lesDERNIERS10 messages. C'est possible?
Supposons que les données de la table entière sont -
1,2,3,4,5....30
J'ai écrit la requête select * from tblmessage where timestamp desc limit 10
Il montre 30,29,28...21
Mais je veux que la séquence soit - 21,22,23...30
Changez le DESC en ASC et vous obtiendrez les enregistrements que vous voulez, mais si vous avez besoin de les commander, vous devrez inverser l'ordre dans lequel ils arrivent. Vous pouvez le faire dans votre propre code ou simplement étendre votre requête, alors:
select * from (select * from tblmessage order by sortfield ASC limit 10) order by sortfield DESC;
Vous devriez vraiment toujours spécifier une clause order by, pas seulement ASC ou DESC.
dans le cas de bases de données volumineuses, l'instruction ORDER BY DESC
peut réellement ralentir le système, par exemple. Tarte aux framboises. Une approche intéressante pour éviter ORDER BY
est la commande OFFSET
. Et vous conservez même la commande enregistrée:
SELECT * FROM mytable LIMIT 10 OFFSET (SELECT COUNT(*) FROM mytable)-10;
voir: http://www.sqlite.org/lang_select.html
vérifiez votre performance avec:
.timer ON
Réponse légèrement améliorée:
select * from (select * from tblmessage order by sortfield DESC limit 10) order by sortfield ASC;
Michael Dillon avait la bonne idée dans sa réponse , mais l'exemple donne les premières lignes, ordre inversé:
select * ... (select * ... ASC limit 10) ... DESC
Il voulait le dernier, ça devrait être:
select * ... (select * ... DESC limit 10) ... ASC
Si votre table contient une colonne avec auto-incrémentation de clé primaire (certains "row_id" par exemple), il vous suffit de sélectionner une option avec une commande DESC par cette colonne.
La demande brute ressemble à
select * from table_name order by row_id DESC limit 10
L'implémentation Android est
private Cursor queryLastEvents() {
return getDatabase().query("table_name", null, null, null, null, null, "row_id DESC", "10");
}
Essaye ça,
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();
}
}
Récupérez ensuite les 10 dernières données.
select * from
(select * from table_name order by yourfield ASC limit 10)
order by yourfield DESC;
Vous ne pouvez pas avoir de meilleures solutions que celle-là.
Dans votre requête, la variable DESC
est interprétée comme un alias de table.
Comme mentionné par ρяσѕρєя K, pour pouvoir spécifier un sens de tri, vous devez trier en premier lieu avec une clause ORDER BY
.
La colonne à trier doit être un horodatage, si vous en avez un, ou une colonne auto-incrémentée comme la clé primaire de la table.
cursor.moveToLast();
while (cursor.moveToPrevious()){
//do something
}
avec la même requête: select * dans tblmessage où timestamp desc limit 10