2012-04-23 49 views
2

我正在構建一個類似於Facebook的消息系統(它顯示消息爲線程)。Facebook喜歡消息系統 - 排序最後回覆

我現在的表設計是:

與此select語句
CREATE TABLE IF NOT EXISTS messages ( 
    mid int(11) NOT NULL auto_increment, 
subject text NOT NULL, 
    message text NOT NULL, 
    fromid varchar(255) NOT NULL default '', 
    toid varchar(255) NOT NULL default '', 
    status varchar(255) NOT NULL default '', 
    date varchar(255) NOT NULL default '', 
    time varchar(255) NOT NULL, 
    PRIMARY KEY (mid) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2825 ;` 

我檢索結果:

SELECT 
    IF(messages.toid = '$uid' OR messages.toid = '$uid', messages.fromid, messages.toid) friend1, 
messages.message, messages.fromid, messages.toid, messages.date, messages.status, messages.time 
FROM messages 
WHERE (messages.toid='$uid' OR messages.fromid='$uid') 
    AND messages.status!='2' 
GROUP BY friend1 ASC 
ORDER BY messages.time DESC, messages.mid DESC 

這給了我正確的結果,除了它顯示的第一篇文章從一個線程,我想讓它在線程中顯示最近的帖子。

我在做什麼錯?

+0

確實放置了一個Facebook標記。 – hjpotter92 2012-04-23 05:43:34

回答

4

這是一個很好的文章直接關係到你的問題:http://kristiannielsen.livejournal.com/6745.html

在您的具體問題,以野生刺,您的查詢可能會需要類似於下面(未經測試!):

SELECT 
    IF(derived_messages.toid = '$uid', derived_messages.fromid, 
    derived_messages.toid) friend1, 
    derived_messages.message, derived_messages.fromid, derived_messages.toid, 
    derived_messages.date, derived_messages.status, derived_messages.time 
FROM 
    (SELECT * 
    FROM messages 
    ORDER BY time desc) derived_messages 
WHERE (derived_messages.toid='$uid' OR derived_messages.fromid='$uid') 
    AND derived_messages.status!='2' 
GROUP BY friend1 ASC 
ORDER BY derived_messages.time DESC, derived_messages.mid DESC 

順便說一下這個條款看起來腥,我(在你的原帖):

IF(messages.toid = '$uid' OR messages.toid = '$uid', 
    messages.fromid, messages.toid) friend1 

什麼是「或」相同的條件之間在做什麼?我想可以跳過第二個條件。

+0

令人驚歎。這很好。 – 2012-04-23 06:59:46

+0

我有一個額外的問題延伸到你的答案上(如果你不介意並且允許的話); 我有一個表,稱爲配置文件,我想加入它獲得用戶名上的朋友1 = profiles.uid - 我將如何去了解這個查詢? – 2012-04-23 07:04:50

+1

恐怕要加入分組結果,你需要第三個嵌套選擇,一個外部「SELECT * FROM(...)結果」,然後使用「INNER JOIN profiles ON(profiles.uid = results.friend1 )任何人都有更好的方法? – 2012-04-23 07:13:40