2009-07-27 20 views
0

私は最近私が開発しているプラ​​イベートメッセージングシステムのSELECTステートメントに穴を発見しました。PHP/MySQL SELECTステートメント - 軽微な問題

はここに私のテーブルの基本的な構造です:

tblpm: 
unique_id thread_id subject content receiver_id sender_id date_sent 

私が開発していますページには、すべての最新のメッセージがユーザに表示されている受信トレイ、です。

私が使用しているSELECT文は次のとおりです。私は最初のユーザーにメッセージを送信すると、それが正常に送信され、受信トレイに表示されない:

$data = mysql_query(" 
SELECT tblpm.* FROM tblpm 
WHERE date_sent 
IN(
    SELECT MAX(date_sent) 
    FROM tblpm 
    GROUP BY message_id 
) 
AND receiver_id ='$usrID' 
ORDER BY id DESC") or die(mysql_error()); 

、ここで私が気づいたものです。 (そうしてはならないので、「送信アイテム」に表示されるはずです)。その後、ユーザーがメッセージ(つまり同じスレッド)に「返信」する場合は、受信トレイにも表示されます。

しかし、SELECT文がMAX(date_sent)を選択するように指定されているため、返信(スレッドの3番目のメッセージ)に返信すると、受信トレイには表示されなくなります。どこのreceiver_ID = $ usrIDスレッドの。問題は、スレッド化されたアイテムの最新の(date_sent)が他の誰かによって "受信"されているためです。その結果、SELECTステートメントはスレッド化アイテムの「any」を表示しません。

これはうまくいけばうまくいきます。ここで

は何が起こっているかを視覚的に表現だ:

unique_id thread_id subject receiver_id sender_id  date_sent 
    1   144   Msg   22   33   2009-07-22 //Will display fine in sent items. 
    2   144   re: Msg  33   22   2009-07-23 //Will display fine in inbox of user (usrID 33). 
    3   144   RE: re:Msg 22   33   2009-07-24 //Once this message is sent, the entire thread (thread_id 144) no longer displays in the inbox. 

この上の任意のヘルプははるかに高く評価されるだろう!

+0

はなぜSELECT文の日付が含まれていますか?なぜスレッドの最後の 'n'メッセージではないのですか? –

答えて

2

これはあなたが欲しいものを行う必要がありますように思える:

$data = mysql_query(" 
SELECT tblpm.* FROM tblpm 
WHERE date_sent 
IN(
    SELECT MAX(date_sent) 
    FROM tblpm 
    WHERE receiver_id ='$usrID' 
    GROUP BY message_id 
) 
AND receiver_id ='$usrID' 
ORDER BY id DESC") or die(mysql_error()); 
+0

こんにちはデニス。それは私が達成しようとしているものに非常に近いものです。これで「スレッド」が再び表示され、正しい位置(上部)に表示されます。しかし、「件名」行は元の件名からのものであり(「RE:msg」とは対照的に)、date_stampも元の時刻である。 最新の行を表示する方法はありますか?ありがとう。 –

+0

デニスは、私は馬鹿にされていた。ごめんなさい! –

関連する問題