2012-12-24 63 views
17

我有一個數據庫保存在我的Android應用程序中,並希望檢索插入到數據庫中的最後10條消息。Android SQLite查詢 - 獲取最新的10條記錄

當我使用:

Select * from tblmessage DESC limit 10; 

它給我的10條消息,但是從TOP。但我想要的消息。可能嗎?

假設整個表的數據是 -

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

我寫查詢select * from tblmessage where timestamp desc limit 10

它顯示30,29,28...21

但我想的序列 - 21,22,23...30

+8

,你將需要改變使用ORDER BY子句查詢'SELECT * FROM tblmessage ORDER BY _id DESC LIMIT 10' –

+0

我猜我的表沒有創建任何_id列。 – Darpan

回答

30

將DESC更改爲ASC,您將獲得所需的記錄,但是如果您需要訂購這些記錄,則需要逆轉它們進來的順序。您可以在自己的代碼中執行該操作,也可以擴展您的查詢,像這樣:

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

你真的應該總是BY子句指定的順序,而不是ASC或DESC。

+0

我想顛倒他們進來的順序。我怎樣才能> –

+1

假設整個表數據是 - 1,2,3,4,5 .... 30 我寫了查詢select * from tblmessage where timestamp desc limit 10 它顯示30,29,28 ... 21 但我想要的序列爲 - 21,22,23 ... 30 我怎樣才能得到相同的 –

+1

太棒了!我不知道你可以像這樣嵌套選擇。 –

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個數據。

0

在您的查詢中,DESC被解釋爲表別名。

正如ρяσѕρєяK所述,爲了能夠指定排序方向,您需要首先使用ORDER BY子句進行排序。

要排序的列應該是一個時間戳,如果有一個,或者像表的主鍵那樣的自動增量列。

20

在大型數據庫上,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 
+0

有可能會發生這種情況,抵消可能會消極,這可能會引發異常 – Atul

+0

當然,您可能會將值從上限和下限調出。但是,sqlite不會拋出異常,但會返回所有可能的值。 – McPeppr

+0

我使用了這個選項,它可以像我想要的那樣工作。它仍然是負值的安全。 –

5

稍有好轉答案:

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

邁克爾·狄龍有在his answer正確的想法,但例子給出了前幾行,inve rted順序:

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

他想最後一次,它應該是:

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

是 - 選擇* ...(選擇* ... DESC限制10)... ASC –

1

如果表中包含主鍵自動增量(一些「ROW_ID」爲例)一列,那麼你只需要單一的選擇與此列

原始請求看起來像

select * from table_name order by row_id DESC limit 10 

的Android IMPL倒序ementation是

private Cursor queryLastEvents() { 
    return getDatabase().query("table_name", null, null, null, null, null, "row_id DESC", "10"); 
} 
+0

這將給出最後10條記錄,但處於REVERSE順序。 – Atul

0
select * from 
(select * from table_name order by yourfield ASC limit 10) 
order by yourfield DESC; 

你不能有比這更好的解決方案。

+0

偉大的解決方案.. – rs11

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

具有相同的查詢: SELECT * FROM tblmessage其中timestamp DESC LIMIT 10

+0

關於爲什麼這是正確的答案的一些評論可能會幫助提問人 – joanolo

+0

我也面臨同一類型的問題在聊天應用程序。但我完成了這樣做cursor.moveToLast(); while(cursor.moveToPrevious()){ //做某事 } –