2011-04-11 3 views
0

나를 도와 주셔서 감사합니다.MySQL 및 PHP 질문에 스레드 된 메시징

저는 MySQL과 PHP를 사용하여 스레드 된 메시징 시스템을 만들고 결과를 XML로 반환합니다. 나는 아이폰 SMS 시스템과 비슷한 방식으로 메시지를 스레드하는 시스템을 만들려고합니다. 사용자간에 단 하나의 스레드가 있고 최신 내용의 스레드가 맨 위에 나타납니다 (마지막 메시지가 전송되었는지 여부는 관계 없음). 또는 수신).

간단한 생각은받은 편지함의 기본 페이지 인 "threads"를 갖는 것입니다. 나는 모든 별개의 스레드 (그리고 마지막으로 보내거나받은 메시지)를 여기서 끌어 내고 싶다. 스레드를 클릭하면 해당 사용자 간의 모든 메시지/응답에 대해 데이터베이스를 쿼리합니다.

내 데이터베이스 구조 :

MESSAGES : 아이디 | senderid | 수신자 | 몸 |

  1. 내가 recipientid = 대한 myid는 사용자가 메시지를 보냈지 만 회신을받은 적이 없었기 때문에 직선 쿼리를 수행하고 사용 할 수 없습니다 시간

    나는 하나의 거대한 질문/문제가 예기치 않은 메시지가 여전히 "받은 편지함"에 (시간 순으로) 나타납니다. 그러나 senderid = myid 또는 recipientid = myid 인 메시지를 선택하면 같은 두 명의 사용자간에 보내고받은 메시지에 대해 쿼리가 오게되므로 두 개의 스레드가 생깁니다. 첫 번째 고유 한 수신 메시지와 최초의 고유 한 송신 메시지가 아닌 두 명의 사용자간에 첫 번째 고유 한 통신을 반환하려면 어떻게해야합니까?

  2. LEFT JOIN을 사용하여 메시지 테이블을 사용자 이름이있는 사용자 테이블에 연결합니다. 나는 단지 그들 ON messages.senderid = users.name. 이것은 현재 사용자가 마지막으로 메시지를 수신하는 스레드에 대해 완벽하게 작동합니다. 그러나 일부 스레드의 경우 현재 사용자가 유일한/마지막 메시지를 보낸 스레드에 대해 위의 LEFT JOIN은 메시지를 보낸 사용자의 이름이 아니라 현재 사용자 이름을 반환합니다. 나는 동적 "만약 같은 것을 쓸 수있는 방법 ($ 사용자 ID를 == 센더) {LEFT users.id = messages.recipientid 사용자를 가입;} 다른 {LEFT이 users.id = 센더 사용자를 가입}

? 주셔서 감사합니다

+0

이 정말 아이폰 SMS 작동 방식을 이해하지 않지만, 당신의 설명에 따라, 나는 그와 같은 문제를 해결할 수로 확실히 대답하지 않습니다!? senderid와 recipientid를 함께 그룹화합니다. 메시지를 쿼리하면 둘 다 차이가 없습니다. – TheOnly92

+0

MySQL에서 두 개의 열을 함께 그룹화 할 수 있습니까? 그것은 완벽한 해결책이 될 것입니다. SELECT senderid, recipientid WHERE group (senderid, recipientid) = $ userid와 같은 것입니다. – Walker

답변

1

어쩌면이 같은

WHERE 
    (senderid = $otheruser 
    AND recipientid = $currentuser) 
    OR 
    (senderid = $currentuser 
    AND recipientid = $otheruser)