2012-04-23 8 views
2

私はFacebookのメッセージングシステム(メッセージをスレッドとして表示)と同様のメッセージングシステムを構築しています。Facebookのようなメッセージングシステム - 最後の返信で並べ替え

私の現在のテーブル設計は次のとおりです。

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文で結果を取得しています:

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

答えて

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 

はところで、この句は(自分のオリジナルのポストに)私に怪しい見えた:「OR」同一の条件の間

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

何をやっていますか?おそらく2番目の条件をスキップすることができます。

+0

素晴らしい。それは素晴らしい仕事でした。 –

+0

私はあなたの答えにまで及ぶ追加の質問を持っています(あなたが気にしないなら、それが許されるかどうか)。 私はプロファイルと呼ばれるテーブルを持っており、私はusername1を取得するためにそれに参加したいと思いますfriend1 = profiles.uid - どのように私はこのクエリで行くのだろうか? –

+1

私はグループ化された結果に参加することを恐れています.3番目のネストされた選択肢、外側の "SELECT * FROM(...)results"を必要とし、 "INNER JOIN profiles ON(profiles.uid = results.friend1誰もがより良いアプローチをしていますか? –

関連する問題