web-dev-qa-db-fra.com

Android SQLite Query - Obtenir les 10 derniers enregistrements

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

20
Gaurav Arora

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.

33
Michael Dillon

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
25
McPeppr

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

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");
}
1
voronnenok

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.

1
No_Rulz
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à.

0
rs11

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.

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

avec la même requête: select * dans tblmessage où timestamp desc limit 10