2009-07-30 12 views
3

について私は現在、プライベートメッセージのフォーラムについては、次の表があります。私は何をしようとしているMySQLのSELECT文のメッセージ

alt text http://img159.imageshack.us/img159/45/pmdata.jpg

alt text http://img504.yfrog.com/img504/3968/pminfo.jpg

を表示する出力「受信箱」であります送信者が誰であるにせよ、トップの最新のスレッドとスレッド別のグループ(つまり、受信トレイに同じスレッドが2回表示されません)。

私は今、2 uesrsの間の簡単なメッセージのためにうまくいきます。ただし、3人目のユーザーが同じスレッドに返信すると、正しく表示されません。私の現在のクエリはこれです:$ USRIDは= 68(したがって、receiver_id = 68)は、それが出力すると仮定すると

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent 
FROM pm_info 
INNER JOIN pm_data ON pm_info.message_id = pm_data.id 
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID 
INNER JOIN (SELECT thread_id, sender_id, MAX(date_sent) AS thread_max_date_sent FROM pm_data GROUP BY thread_id, sender_id) deriv1 ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent AND pm_data.sender_id = deriv1.sender_id 
WHERE pm_info.receiver_id = '$usrID' 
ORDER BY deriv1.thread_max_date_sent DESC 

この:thread_idは(13587)が二回まで様子を示し

From: Kyle (pm_data.id = 18) RE: single message (thread_id= 13587) 
From: Ed (pm_data.id = 12) RE: single message (thread_id= 13587) 
From: Ed (pm_data.id = 8) RE: Test Number 2 (thread_id= 16256) 

お知らせなぜならそこに2人の異なる送信者です。

どうすればいいですかは送信者が誰であっても最新のthread_idを表示しますか?

多くの感謝!

答えて

0

実際に元の質問のクエリは、各スレッドの実際の最新のレコードを取得するための非常に小さな変更が必要なようです。

  1. ドロップフィールド
  2. BYサブクエリのグループにおけるSENDER_IDはON句サイドノートとして
 
SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent 
FROM pm_info 
INNER JOIN pm_data ON pm_info.message_id = pm_data.id 
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID 
INNER JOIN (SELECT thread_id, /*sender_id,*/ MAX(date_sent) AS thread_max_date_sent 
       FROM pm_data GROUP BY thread_id /*, sender_id*/) deriv1 
    ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent /*AND pm_data.sender_id = deriv1.sender_id*/ 
WHERE pm_info.receiver_id = '$usrID' 
ORDER BY deriv1.thread_max_date_sent DESC 

pm_data.sender_id = deriv1.sender_idドロップ:可能な場合、そのサブクエリでmax(date_sent)の代わりにmax messageIDを探します。

1

SELECT pm_info.is_read, group_concat(DISTINCT sender.usrFirst) as sender_name, 
    pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid, 
    MAX(date_sent) AS thread_max_date_sent 
FROM pm_info 
INNER JOIN pm_data ON pm_info.message_id = pm_data.id 
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID 
WHERE pm_info.receiver_id = '$usrID' 
GROUP BY pm_data.thread_id 
ORDER BY thread_max_date_sent DESC; 

が、それはあなたのニーズを満たしていない場合、GROUP_CONCATの一部に反対してお気軽にお試しください

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid 
FROM pm_data, pm_info, tblUsers as sender 
WHERE pm_info.message_id = pm_data.id 
    AND pm_data.sender_id = sender.usrID 
    AND pm_info.receiver_id = '$usrID' 
GROUP BY thread_id 
ORDER BY date_sent DESC 
LIMIT 0,1 
0

てみてください。 これは、任意の1つを選択するのではなく、関連するすべての送信者を一覧表示するだけです。

0

私の提案は、データベースを2つのテーブルに分割して正規化:「スレッド」と「メッセージ」。スレッドのタイトルのように、すべてのメッセージに共通するスレッド情報があります。同じ値を繰り返すことで、メッセージテーブルにスペースが無駄になります。

スレッドテーブルには、「最後の投稿時刻」フィールドがあります。これは新しい投稿ごとに更新されます。それから、スレッドテーブルから選択し、最後の投稿順に並べるだけの簡単なことです。それもずっと速くなるでしょう。