문제

현재 개인 메시징 포럼에 대한 다음 테이블이 있습니다.

Alt Text http://img159.imageshack.us/img159/45/pmdata.jpg

Alt Text http://img504.yfrog.com/img504/3968/pminfo.jpg

내가하려는 것은 상단에 가장 최근의 스레드를 표시하고 스레드별로 그룹을 표시하는 "받은 편지함"을 출력하는 것입니다 (의미,받은 편지함에 동일한 스레드가 두 번 표시되지 않음).

내가 지금 가지고있는 것은 2 개의 uesrs 사이의 간단한 메시지에 적합합니다. 그러나 세 번째 사용자가 동일한 스레드로 대답하면 올바르게 표시되지 않습니다. 내 현재 쿼리는 다음과 같습니다.

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)

2 개의 다른 발신자가 있기 때문에 Thread_id (13587)가 두 번 나타나는 방법에 주목하십시오.

어떻게 가질 수 있습니까? 단지 발신자가 누구든 상관없이 가장 최근의 Thread_id를 표시합니까?

많은 감사 !!

도움이 되었습니까?

해결책

실제로 원래 질문의 쿼리는 각 스레드에 대한 실제 최신 레코드를 얻기 위해서는 매우 작은 변경이 필요합니다.

  1. 서브 쿼리 그룹에서 fields에 의해 sender_id를 떨어 뜨립니다.
  2. 떨어 뜨립니다 pm_data.sender_id = deveriv1.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

부수적으로 : 가능하면 Max 대신 해당 하위 퀘스트에서 Max Messageid를 찾으십시오 (date_sent).

다른 팁

노력하다

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

노력하다

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 부분에 자유롭게 동의하지 마십시오. 임의로 하나를 선택하는 대신 모든 관련 발신자를 나열합니다.

내 제안은 데이터베이스를 더 나은 정규화를 위해 두 개의 테이블로 나누는 것입니다 : "스레드"및 "메시지". 스레드 제목과 같은 모든 메시지에 공통적 인 스레드 정보가 있습니다. 동일한 값을 반복하여 메시지 테이블에 공간을 낭비하고 있습니다.

"마지막 포스트 타임"필드는 스레드 테이블을 가질 수 있으며 각 새 게시물에서 업데이트됩니다. 그런 다음 스레드 테이블에서 선택하고 마지막 게시물에서 주문하는 간단한 문제 일뿐입니다. 훨씬 더 빠를 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top