2009-07-30 54 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個用戶之間的簡單消息。但是,一旦第三位用戶回覆到同一個線程,它將無法正確顯示。我的當前查詢是這樣的:

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 

假定$ usrID = 68(因此,receiver_id = 68)時,它輸出該:

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) 

通知所述的thread_id(13587)中的顯示方式的兩倍,因爲有是2個不同的發件人。

我怎麼能這樣只是顯示最近的thread_id,不管發件人是誰?

非常感謝!

回答

0

它實際上似乎是原始問題中的查詢只需要非常小的變化來獲取每個線程的實際最新記錄。

  1. 下降的子查詢的組SENDER_ID田野
  2. pm_data.sender_id = deriv1.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 

補充說明中:如果可能的話,尋找在該子查詢中的最大messageID而不是最大值(date_sent)

1

嘗試

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

嘗試

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部分不同意,如果不能滿足您的需求;它只是列出所有相關的發件人,而不是任意選擇一個發件人。

0

我的建議是將您的數據庫分成兩個表,以便更好規範化:「線程」和「消息」。所有消息都會有線程信息,如線程標題。您通過重複相同的值來浪費消息表中的空間。

您可以在每個新帖子更新的線程表中有一個「上次發佈時間」字段。然後,只需從線程表中選擇並按最後一個帖子排序即可。它也會快很多。