web-dev-qa-db-ja.com

Android SQLite Query-最新の10レコードの取得

Androidアプリケーションにデータベースを保存していて、DBに挿入された最新の10個のメッセージを取得したい。

私が使用する場合:

Select * from tblmessage DESC limit 10;

10個のメッセージが表示されますが、[〜#〜] top [〜#〜]からです。しかし、私は[〜#〜] last [〜#〜] 10メッセージが欲しいです。出来ますか?

テーブル全体のデータが-

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

クエリを書いたselect * from tblmessage where timestamp desc limit 10

それが示している 30,29,28...21

しかし、私は-21,22,23...30

21
Gaurav Arora

DESCをASCに変更すると、必要なレコードを取得できますが、それらを注文する必要がある場合は、入ってくる順序を逆にする必要があります。それを独自のコードで行うか、クエリを次のように拡張できます。そう:

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

ASCやDESCだけでなく、order by句を常に指定する必要があります。

36
Michael Dillon

大規模なデータベースでは、ORDER BY DESCステートメントによってシステムが実際に遅くなる場合があります。ラズベリーパイ。 ORDER BYを避ける良い方法は、OFFSETコマンドです。さらに、保存された順序を維持します。

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

参照: http://www.sqlite.org/lang_select.html

あなたのパフォーマンスをチェックしてください:

.timer ON
27
McPeppr

少し改善された答え:

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

Michael Dillonは his answer で正しい考えを持っていましたが、例では最初の数行を逆順で示しています。

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はテーブルエイリアスとして解釈されます。

ΡяσѕρєяKで述べたように、並べ替え方向を指定できるようにするには、最初にORDER BY句で並べ替える必要があります。

並べ替える列は、タイムスタンプ(存在する場合)、またはテーブルの主キーのような自動インクリメント列である必要があります。

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

同じクエリ: select * from tblmessage where timestamp desc limit 10