Bạn sẽ cần hai phép nối. Một cái gì đó như sau sẽ giúp bạn bắt đầu (mặc dù tôi không hiểu 100% mối quan hệ giữa pm_data
và pm_info
):
SELECT pm_info.is_read, sender.usrFirst + ' ' + sender.usrLast as sender_name,
pm_data.date_sent, pm_data.title, pm_data.thread_id
FROM pm_info
INNER JOIN pm_data ON pm_info.thread_id = pm_data.thread_id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = tblUsers.usrID
WHERE pm_info.receiver_id = @USER_ID /*in this case, 2*/
ORDER BY pm_data.date_sent DESC
Tôi giả định mối quan hệ giữa pm_data
và pm_info
là id chủ đề. Nếu không, bạn có thể điều chỉnh những điều trên theo bất kỳ thứ gì bạn cần. Tôi cũng đã sắp xếp theo ngày gửi ở đây, nhưng nó sẽ không giữ các chuỗi lại với nhau . Tôi không chắc liệu bạn có muốn giữ chúng lại với nhau hay không theo cách bạn đã diễn đạt câu hỏi của mình.
Nếu bạn muốn giữ các chuỗi cùng nhau , bạn sẽ cần một truy vấn phức tạp hơn:
SELECT pm_info.is_read, sender.usrFirst + ' ' + sender.usrLast as sender_name,
pm_data.date_sent, pm_data.title, pm_data.thread_id
FROM pm_info
INNER JOIN pm_data ON pm_info.thread_id = pm_data.thread_id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = tblUsers.usrID
INNER JOIN (SELECT thread_id, MAX(date_sent) AS max_date
FROM pm_data
GROUP BY thread_id) AS most_recent_date
ON pm_data.thread_id = most_recent_date.thread_id
WHERE pm_info.receiver_id = @USER_ID /*in this case, 2*/
ORDER BY most_recent_date.max_date DESC, pm_data.thread_id,
pm_data.date_sent DESC
Truy vấn này sử dụng một lựa chọn con để tìm ngày được sửa đổi gần đây nhất cho mỗi chuỗi, sau đó sắp xếp theo thứ này trước tiên.