26

我在我的 Android 应用程序中保存了一个数据库,并且想要检索插入到数据库中的最后 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;

您确实应该始终指定 order by 子句,而不仅仅是 ASC 或 DESC。

于 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
 "SELECT *  FROM( SELECT *  FROM " + tablename + whereClause + " ORDER BY timestamp DESC LIMIT 10)  ORDER BY timestamp ASC";
于 2020-10-16T10:19:51.503 回答
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 回答
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 回答