2013-01-04 3 views
1

내받은 편지함에는 한 명의 사용자로부터받은 여러 개의 메시지 만 표시됩니다. 내받은 편지함을 페이스 북처럼 표시해야합니다. 한 사용자 당 하나의 메시지 만 표시합니다. 대화보기와 매우 비슷합니다. 여기서 나와 나와있는 사용자 사이의 마지막 메시지가받은 편지함에 표시됩니다 (마지막 메시지 또는 마지막 회신).MySQL :받은 편지함의 마지막 메시지를 사용자 당 하나씩 표시

GROUP BY를 시도했지만 결과가 정확하지 않습니다. 최근의 일부 메시지는 표시되지 않으며 마지막 대화 날짜별로 정렬되지 않습니다.

다음
+-----------------------------------------------------------------------------------+ 
|         users_messages         | 
+-----------------------------------------------------------------------------------+ 
| message_ID | sender |receiver| date | subject | body | unread | delete1 | delete2 | 
+-----------------------------------------------------------------------------------+ 

+---------------------+ 
|  members  | 
+---------------------+ 
| id | username | ... 
+----+----------+-----+ 

내 현재 쿼리입니다 :

여기 내 데이터베이스 구조의

$result = $DB->query("SELECT p.*, p.sender as sender, m.* 
FROM " . DB_PREFIX . "messages p 
LEFT JOIN " . DB_PREFIX . "members m ON p.sender=m.member_id 
WHERE p.receiver='" . $SESSION->conf['member_id'] . "' AND delete2=0 
GROUP BY p.sender ORDER BY p.senddate DESC 
LIMIT " . (($page - 1) * $PREFS->conf['per_page']) . ", " . $PREFS->conf['per_page']); 
+1

사용자 ID에 GROUP BY를 사용합니다. – Joddy

+0

@Joddy : 두 개의 개별 사용자 ID 필드가 있습니다. 간단한 'GROUP BY'로는 충분하지 않습니다. – Kaivosukeltaja

+0

@Kaivosukeltaja - 그러나 수신자 (사용자 ID 유형 2)가 수정되었습니다. 현재 변수 만 남아 있습니다 (사용자 ID 유형 1). 그래서'p.sender'에있는'GROUP BY '가 문제를 해결하지 않을까요? – Joddy

답변

0
SELECT t1.*, t2.* 
FROM 
    users_messages AS t1 
LEFT JOIN members AS t2 
    ON t1.sender = t2.id 
LEFT JOIN users_messages AS t3 
    ON t1.sender = t3.sender AND t1.receiver = t3.receiver 
    AND t1.message_ID < t3.message_ID 
WHERE (t1.sender = @userid OR t1.receiver = @userid) AND t3.message_ID IS NULL 

내가 감독을 한 수 있으므로 테스트하지 않았습니다하지만 하나의 옵션은 당신이 할 수있다 보낸 사람과받는 사람에 대한 user_messages 자체 조인 및 t1.message_ID < t3.message_ID. t1의 쌍 사이의 가장 최근 메시지에는 t3에 조인 후보가 없으므로 왼쪽 조인이므로 t3 열은 null이되고 where 절에서 가장 최근의 것을 가져올 수 있습니다.