我目前有一个私人信息论坛的以下表格:
alt text http://img159.imageshack.us/img159/45/pmdata.jpg
alt text http://img504.yfrog.com/img504/3968/pminfo.jpg
我要做的是输出一个“收件箱”,在顶部显示最新的线程,并按线程分组(也就是说,在收件箱中看不到同一个线程两次),不管发件人是谁。
我现在所拥有的对于2个uesr之间的简单消息来说是很好的。但是,一旦第三个用户回复同一个线程,它就不能正确显示。我现在的问题是:

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(因此,接收器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)

注意线程id(13587)是如何显示两次的,因为有两个不同的发送者。
我怎么能让它只显示最近的线程ID,不管发件人是谁?
非常感谢!!

最佳答案

实际上,原始问题中的查询似乎只需要很小的更改就可以获取每个线程的实际最新记录。
在子查询的“分组依据”字段中删除发件人ID
在on子句中删除pm_data.sender_id=deriv1.sender_id
选择pm_info.is_read,sender.usrfirst作为sender_name,pm_data.date_sent,pm_data.title,pm_data.thread_id,pm_data.id作为dataid,thread_max_date_sent
来自pm_info
内部连接pm_data on pm_info.message_id=pm_data.id
内部连接tblusers作为pm_data.sender_id=sender.usrid上的发件人
内部联接(选择thread_id,/*sender_id,*/max(date_sent)作为thread_max_date_sent
来自pm_data group by thread_id/*,sender_id*/)deriv1
在pm_data.thread_id=deriv1.thread_id和pm_data.date_sent=deriv1.thread_max_date_sent/*和pm_data.sender_id=deriv1.sender_id上*/
其中pm_info.receiver_id='$usrid'
订单按deriv1.thread_max_date_sent desc
另请注意:如果可能,请在该子查询中查找max messageid,而不是max(date_sent)

08-26 08:19