2009-12-20 23 views
0

我正在爲約會網站構建一個私人消息系統。下面是表的結構:Group By/Threaded Messaging MySQL Prob

`id` bigint (20) NOT NULL AUTO_INCREMENT , 
`fromme` integer (11) NOT NULL, 
`tome` integer (11) NOT NULL, 
`subject` varchar (255) NOT NULL, 
`message` longtext NOT NULL, 
`mydate` datetime NOT NULL, 
`thread` varchar (255) NOT NULL, 
`receipt` varchar (50) NOT NULL, 
`INDELETE` varchar (5), 
`SENTDELETE` varchar (5), 
PRIMARY KEY (`id`) 

當用戶發送一個新的消息發送給另一用戶,它產生一個隨機串跟蹤線程的。在他們回覆時,它帶有線程字符串(類似於facebook)。當用戶登錄時,他們可以看到收件箱中的所有郵件,並根據它是否爲新郵件來更改該行的bg顏色。所有這一切都工作正常,除了收到的消息已經來回線程的狀態。這是查詢:

select messages.id, messages.fromme, messages.subject, messages.message, messages.receipt, messages.mydate, messages.thread, users.firstname, users.lastname, users.image1 
from messages, users 
where messages.tome = '40' and messages.INDELETE !='y' and messages.fromme = users.id 
GROUP BY messages.thread 
ORDER BY messages.mydate desc 

它正常返回,但該組由函數返回的thread..I的第一條消息需要以最新的一個,以使其正常工作。任何人都知道如何做到這一點?

回答

1

爲了得到GROUP BY子句的好處,您需要一個聚合函數(MAX,SUM,COUNT等)。你可能想用這個子查詢中的每個線程制定出最新(最高ID)消息:

select MAX(messages.id) id, messages.thread 
FROM messages 
GROUP BY messages.thread 

全部放在一起,你可以使用

SELECT messages.id, 
     messages.fromme, 
     messages.subject, 
     messages.message, 
     messages.receipt, 
     messages.mydate, 
     messages.thread, 
     users.firstname, users.lastname, users.image1 
    FROM messages, 
     users, 
     (SELECT MAX(messages.id) id, messages.thread thread 
      FROM messages 
     GROUP BY messages.thread) latest, 
WHERE messages.tome = '40' 
    AND messages.INDELETE !='y' 
    AND messages.fromme = users.id 
    AND messages.id=latest.id 
ORDER BY messages.mydate desc 
2

答案@Ollie瓊斯是好的(除過時的SQL-89逗號式聯接語法),但對於什麼是值得這裏是一個另類:

SELECT m1.*, u.* 
FROM messages m1 
LEFT OUTER JOIN messages m2 
    ON (m1.thread=m2.thread AND m1.mydate < m2.mydate) 
JOIN users u ON (m1.fromme = u.id) 
WHERE m2.thread IS NULL; 

沒有GROUP BY需要。這將每行m1匹配到具有相同線程和更晚日期的假想行m2。當沒有第m2行匹配時,則m1必須是線程中的最新消息。

這個解決方案對於MySQL來說很好,因爲MySQL通常會在查詢GROUP BY的時候創建一個臨時表。聯接解決方案通常更快。確保你有一個索引(thread,mydate)。