我的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
答案 0 :(得分:33)
将DESC更改为ASC,您将获得所需的记录,但如果您需要这些记录,则需要撤消它们的顺序。您可以在自己的代码中执行此操作,也可以直接扩展您的查询如下:
select * from (select * from tblmessage order by sortfield ASC limit 10) order by sortfield DESC;
您确实应该始终指定order by子句,而不仅仅是ASC或DESC。
答案 1 :(得分:26)
在大型数据库上,ORDER BY DESC
语句确实可能会降低系统速度,例如覆盆子pi。避免ORDER BY
的一个好方法是OFFSET
命令。你甚至保留了存储的订单:
SELECT * FROM mytable LIMIT 10 OFFSET (SELECT COUNT(*) FROM mytable)-10;
请参阅:http://www.sqlite.org/lang_select.html
通过以下方式查看您的表现:
.timer ON
答案 2 :(得分:6)
答案稍有改善:
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
答案 3 :(得分: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个数据。
答案 4 :(得分: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");
}
答案 5 :(得分:1)
"SELECT * FROM( SELECT * FROM " + tablename + whereClause + " ORDER BY timestamp DESC LIMIT 10) ORDER BY timestamp ASC";
答案 6 :(得分:0)
在您的查询中,DESC
被解释为表别名。
如ρяσѕρєяK所述,为了能够指定排序方向,您需要首先使用ORDER BY
子句进行排序。
要排序的列应该是时间戳(如果有的话)或自动增量列(如表的主键)。
答案 7 :(得分:0)
cursor.moveToLast();
while (cursor.moveToPrevious()){
//do something
}
使用相同的查询:从tblmessage中选择*其中timestamp desc limit 10