2011-07-04 2 views
2

내 기본 사항이 아닌 기본 SQL 문을 넘어선 모든 것.PHP에서 내부 조인이 포함 된 메시지에 대한 응답 수를 표시합니다.

내가 코딩하고있는 메시징 시스템은 페이스 북과 비슷하지만 별도의 메시지 대신 하나의 기본 메시지에 회신하고 참여중인 모든 메시지가 한 자리에 표시됩니다.

메일 테이블 :

  • mailUser mailID

    • : 메시지
    • MAILTO를 보낸 사람을
    • mailUnread : 1
    • mailBody
    • mailCurrency
    • mailSubject 읽지입니다
    • mailTime
    • mailDeleted :
    • mailreplyUser을 mailreplyID

      • : 사용자
      • mailreplyDeleted를 회신 할 것 : 1은 mailreply 테이블에

      관련 필드를 삭제 1

    • mailreplyTo 삭제 : 응답 한 메시지의 ID

    원본 나는 응답 횟수를 세지 않고 잘 작동하도록 코드를 만들었지 만 번호를 포함하는 것이 도움이된다고 결정했습니다.

    내가 원래 한 것입니다 :

    SELECT 
        a.mailID, 
        a.mailUser, 
        a.mailTo, 
        b.username AS usernamea, 
        c.username AS usernameb 
    FROM 
        mail a, users b, users c 
    WHERE 
        (a.mailUser = b.id OR a.mailUser = c.id) 
        AND (a.mailTo = '".$id."' OR a.mailUser = '".$id."') 
        AND a.mailDeleted = '0' 
    GROUP BY a.mailID 
    ORDER BY a.mailID DESC 
    

    이 있었다 내 시도 :

    SELECT 
        a.mailID, 
        a.mailUser, 
        a.mailTo, 
        b.username AS usernamea, 
        c.username AS usernameb 
    FROM 
        mail a, users b, users c 
        LEFT JOIN mailreply d 
        ON d.mailreplyTo = a.mailID 
    WHERE 
        (a.mailUser = b.id OR a.mailUser = c.id) 
        AND (a.mailTo = '".$id."' OR a.mailUser = '".$id."') 
        AND a.mailDeleted = '0' 
    GROUP BY a.mailID 
    ORDER BY a.mailID DESC 
    

    감사

  • +0

    안녕하세요 Rebecca, Welcome to Stack Oveflow! 두 번째 시도가 효과가 있었습니까? 오류나 예기치 않은 결과가 있었습니까? –

    +0

    슬프게도 없습니다."제공된 인수가 유효한 MySQL 결과 리소스가 아닙니다."오류가 발생합니다. 나는 문제가 무엇인지 모르겠다. 그리고 나는 행운이없는 상황을 바꾸려고 노력하고있다. –

    +0

    나는이 문제를 해결하는 데 중요하지 않은 것처럼 보이는 열을 쿼리에서 제거 할 자유를 가졌으나 걱정하지 않기를 바란다. 일단 우리가 한 번만 다시 추가 할 수 있어야한다. 이걸 알아 냈어. 또한, 언급 한 오류는 PHP 오류처럼 들린다 ... MySQL 자체에서 오류가 발생 했습니까? –

    답변

    0

    이 시도 :

    SELECT 
        a.mailID, 
        a.mailUser, 
        a.mailTo, 
        b.username AS fromUsername, 
        c.username AS toUsername, 
        count(d.mailReplyID) as mailCount 
    FROM 
        mail a 
        INNER JOIN users b ON b.id=a.mailUserId 
        INNER JOIN users c ON c.id=a.mailTo 
        LEFT JOIN mailreply d 
        ON d.mailreplyTo = a.mailID 
    WHERE 
        (a.mailTo = '".$id."' OR a.mailUser = '".$id."') 
        AND a.mailDeleted = '0' 
    GROUP BY a.mailID 
    ORDER BY a.mailID DESC 
    

    당신은에 가입해야 각면에 사용자 테이블 사용자 이름을 가져 오는 메시지 난 당신이 현재 사용자가 발신자 또는 조인 사양받는 사람이 있는지 확인하기 위해 where 절을 혼란스럽게 생각합니다, 그 대신 쉼표로 테이블을 분리하고 where 절에 조인 사양을 넣는 대신 INNER JOIN 구문을 사용하는 좋은 이유입니다.

    메일 ID로 올바르게 그룹화 한 다음 mailreply 테이블의 카운트 열을 추가하십시오. 이 테이블은 합쳐진 채로 남았습니다.이 테이블은 사용자가 올바르게 작성한 것으로서 응답 수가 0 인 메시지도 반환합니다.

    당신을 위해 그것을 소망하는 희망 - 거의 거기에 있었다!

    제임스

    관련 문제