26

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

私が使用するとき:

Select * from tblmessage DESC limit 10;

それは私に10のメッセージを与えますが、TOPからです。しかし、私は最後の10のメッセージが欲しいです。出来ますか?

テーブルデータ全体が-であると仮定します。

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

クエリを書きましたselect * from tblmessage where timestamp desc limit 10

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

しかし、私はシーケンスを次のようにしたいと思います-21,22,23...30

4

9 に答える 9

41

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

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

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

于 2012-12-24T08:17:08.393 に答える
29

大規模なデータベースでは、ORDER BY DESCステートメントによってシステムの速度が低下する可能性があります(例:ラズベリーパイ)。避けるべき良いアプローチORDER BYOFFSETコマンドです。そして、保存された順序を保持することもできます。

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

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

次のコマンドでパフォーマンスを確認してください。

.timer ON
于 2015-03-04T17:04:52.690 に答える
8

少し改善された答え:

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

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

select * ... (select * ... ASC limit 10) ... DESC

彼は最後が欲しかった、それは次のようになるはずです:

select * ... (select * ... DESC limit 10) ... ASC
于 2015-07-19T14:21:16.563 に答える
1

これを試して、

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個のデータを取得します。

于 2012-12-24T07:39:50.783 に答える
1

テーブルに主キーの自動インクリメントを含む列(たとえば、「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");
}
于 2015-09-15T16:04:39.520 に答える
1
 "SELECT *  FROM( SELECT *  FROM " + tablename + whereClause + " ORDER BY timestamp DESC LIMIT 10)  ORDER BY timestamp ASC";
于 2020-10-16T10:19:51.503 に答える
0

クエリでは、DESCはテーブルエイリアスとして解釈されます。

ρяσѕρєяKで述べたように、ソート方向を指定できるようにするには、最初にORDER BY句を使用してソートする必要があります。

ソートされる列は、タイムスタンプがある場合はタイムスタンプ、またはテーブルの主キーのような自動インクリメント列である必要があります。

于 2012-12-24T08:24:34.180 に答える
0
select * from
(select * from table_name order by yourfield ASC limit 10)
order by yourfield DESC;

これ以上の解決策はありません。

于 2017-08-12T09:03:09.760 に答える
0
cursor.moveToLast();
while (cursor.moveToPrevious()){
       //do something
}

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

于 2017-09-03T17:40:05.907 に答える