2014-04-06 105 views
0

的最後一條消息我有以下結構的SQLite表:查詢來獲取每個不同行

create table Message (
    _id integer primary key autoincrement, 
    convo_id text, 
    isSender BOOLEAN, 
    isRead BOOLEAN, 
    message text, 
    time timestamp default (strftime('%s', 'now')) 
); 

它存儲所有爲每個朋友具有唯一convo_id的消息。

我想要一個查詢獲取最後一條消息爲每個convo_id(或換句話說,每個朋友的最後一條消息)。

+0

我想 由於** __id **是自動增量,所以不知怎的,如果我可以得到每個** convo_id **的最大值(** __id **),我可以從返回的** _id ** s得到最後一個消息 –

+0

什麼@ Rezoan的意思是,如果你在問這個問題之前是否嘗試自己寫一個查詢?如果您的查詢存在問題,請將其添加到您的問題中,我們會爲您提供幫助。也就是說,您需要按時間戳對結果進行排序,並將每個convo_id的結果數量限制爲1。 – rb512

回答

1

首先,找出每個convo_id最後的時間戳:

SELECT convo_id, 
     MAX(time) AS time 
FROM Message 
GROUP BY convo_id 

然後,使用這些值來過濾原始表中的記錄:

SELECT Message.* 
FROM Message 
JOIN (SELECT convo_id, 
      MAX(time) AS time 
     FROM Message 
     GROUP BY convo_id) 
USING (convo_id, time) 

如果你有3.7.11的SQLite或更高版本,可以在一個單一的步驟做的一切:

SELECT *, 
     MAX(time) 
FROM Message 
GROUP BY convo_id 
+0

它在我的支持Sqlite 3.6的Android API 10上工作,簡而言之,您的單步解決方案也適用於較低版本。 Thnx –

+0

不保證能夠正常工作(特別是如果最大時間沒有存儲在表格的最後)。 –

0

事情與此類似:

select convo_id,message from Message where (convo_id,_id) IN (select convo_id,max(_id) as _id from Message group by convo_id); 

可能包含語法錯誤。我沒有在我的電腦上試用它。