2012-10-05 124 views
2

我有一個帶有表MESSAGE的數據庫,它包含我所有的消息。 我需要找到所有最後的對話信息。SQL嵌套查詢問題

表包含以下字段: ID(INT) 從(INT) ,與(int) 日期(日期) 消息(VARCHAR)

我需要找到返回我的所有查詢最後的消息。 例如:

1 -> 3 : This is a first message; yesterday 
3 -> 1 : This is the last one; today 
1 -> 2 : Another message with 1 and 2; some time 
3 -> 5 : Some message i don't need; some time 

我需要找到:

"3 -> 1 : This is the last one; today" 
"1 -> 2 : Another message with 1 and 2; some time" 

我希望這是清楚我的意思......我 已經可以發現我有一個交談的用戶,這個查詢:

在該示例中用戶具有標識= 47

select distinct m.To from MESSAGE m Where m.From = 47 union select distinct m2.from From MESSAGE m2 where m2.To = 47 

謝謝!

+0

最後一個線程(發件人 - 收件人)還是最後一個發件人或收件人? – amphibient

+0

最後在線程中,所以有點像在手機上一樣,您可以在短信收件箱中看到所有對話,並查看最後一條消息,發送它或發送它並不重要 – dumazy

+0

什麼我會做的是有一個列(這可能看起來違反規範化,但會提高性能)threadID,這將是,然後爲了簡單分組。所以在上面的例子中,相應的線程ID將是:1.3(對於1-> 3),1.3(對於3-> 1),1.2(對於1-> 2),3.5(對於3-> 5) – amphibient

回答

2

我認爲這會做你想要什麼,假設ID可以被用來定義「最後一條消息」:

select m.* 
from message m join 
    (select least(from, to) as p1, greatest(from, to) as p2, max(id) as maxid 
     from message m 
     group by least(from, to), greatest(from, to) 
    ) mmax 
    on m.id = mmax.maxid 

這個us通過id找到對話中的最後一條記錄。然後它回來收到消息。

2

男人,這真的很粗糙,看起來很醜陋,但我認爲這是一個體面的起點......讓用戶進入一個「虛擬化」的單一表格,獲得最大信息日期,然後每個用戶ID爲那些,並加入原始消息表。這至少是希望! :)請注意,「from」值幾乎肯定是一個保留的SQL關鍵字,所以實際上它需要來自fromID或類似的東西,但無論如何...有了這樣的警告......

* 編輯:測試前面的例子,這是不完全正確的,但每個SQLFiddle這一個工程在http://sqlfiddle.com/#!3/3f586/2

select distinct fromid, toid, message 
    from messages 
    join (select distinct max(msgDate) msgdate, userid from 
        (select max(messageDate) msgdate, fromID userid 
         from messages 
         group by fromID 
         union 
        select max(messageDate), toID userid 
         from messages 
         group by toID) as j group by userid) as x 
    on (messages.fromID=x.userid 
     or messages.toID=x.userid) 
    and messages.messageDate=x.msgdate