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
DESCをASCに変更すると、必要なレコードを取得できますが、それらを注文する必要がある場合は、入ってくる順序を逆にする必要があります。それを独自のコードで行うか、クエリを次のように拡張できます。そう:
select * from (select * from tblmessage order by sortfield ASC limit 10) order by sortfield DESC;
ASCやDESCだけでなく、order by句を常に指定する必要があります。
大規模なデータベースでは、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
少し改善された答え:
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
テーブルに主キーの自動インクリメントの列(たとえば、「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");
}
これを試して、
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個のデータを取得します。
select * from
(select * from table_name order by yourfield ASC limit 10)
order by yourfield DESC;
これよりも良い解決策はありません。
クエリでは、DESC
はテーブルエイリアスとして解釈されます。
ΡяσѕρєяKで述べたように、並べ替え方向を指定できるようにするには、最初にORDER BY
句で並べ替える必要があります。
並べ替える列は、タイムスタンプ(存在する場合)、またはテーブルの主キーのような自動インクリメント列である必要があります。
cursor.moveToLast();
while (cursor.moveToPrevious()){
//do something
}
同じクエリ: select * from tblmessage where timestamp desc limit 10