2009-10-02 1 views
0

메시지가 포함 된 mysql 테이블이 있습니다.MySQL : 대화 목록 만들기 (user_id와의 마지막 메시지)

id (INT) 
sender_id (INT) 
recipient_id (INT) 
sent_time (INT) 
read_time (INT) 
body (TEXT) 

사용자 X가 다른 사용자에게 보낸 가장 최근 메시지 목록을 검색해야합니다.

다른 말로하면 주어진 사용자와 교환 된 마지막 메시지의 sent_time으로 정렬 된 다른 사용자와 전체 대화 목록을 만들고 싶습니다. 최종 결과 (PHP로 처리)는 다음과 같이됩니다.

array (
    array (other_user_1_id, last_msg_sent_time, last_msg_is_read, 
      last_msg_is_to_me/from_me, number_of_messages*), 
    array (other_user_2_id, ...) 
) 

*) number_of_messages은 옵션이지만 오히려 사용하기가 좋습니다.

질문 : 가장 효율적으로 어떻게합니까? 별도의 테이블 "대화"를 만들고 누군가가 메시지를 보내거나 읽거나 "메시지"테이블에 대해 정교하지만 단일 쿼리를 만들 때마다 업데이트합니까? 후자의 경우 쿼리는 어떻게 생겼을까요?

답변

0

코드 버거의 게시물에 제공된 코드의 조언을 따르 겠지만 다른 옵션을 추가하는 것입니다 (코드가 솔루션과 관련하여 새로운 것은 아닐 것 같습니다).

가능한 옵션은 다음과 같습니다 SENDER_ID (INT)와 recipient_id (INT) (각 SENDER_ID에 대해 별도의 테이블을 만드는 당신이 알고 그런 식으로 검색 시간

  • 을 높이기 위해 모두

    1. 색인 누가 대화 사이 - 그것은 단지 1 일에 대화입니다 가정 - 그냥 IDS는 일반적인 두 개의 테이블)

    3에서 뽑을 수 나의 가장 좋아하는 아이디어는 거래 데이터베이스를 참조하고 대화 번호에서 색인 된 각 거래의 기록을 유지하는 추가 열을 만듭니다 ... 그것은 아마도 어떤면에서는 "최악"이지만 더 조직적인 방식입니다. 당신은 질문이있는 경우

    , 내가 정교한 수, 사실, 내가 네 집에

  • +0

    또는 세 번째 옵션의 변형 - 대화의 첫 번째 행의 ID가 포함 된 추가 열을 만듭니다. 이렇게하면 SELECT * WHERE sender_id = '$ uid'또는 recipient_id = '$ uid'GROUP BY first_id ORDER BY sent_date DESC를 수행 할 수 있습니다. 이봐, 더 나은 - 나는이 두 사용자 간의 대화에서 주어진 메시지의 연속 번호를 포함하는 또 다른 열을 추가 할 수 있습니다. 삭제가 없으면 꽤 잘 작동합니다.:) 그것에 대한 의견이 있으십니까? – Mike

    +0

    그냥 삭제를 테이블을 업데이 트해야 ... 인덱싱이 CRUCIAL이 비록 매우 중요합니다 ... 내가 거래의 다량과 일을하고 그게 전부 도와 줬어 – parkman47

    +0

    나는 인덱싱하지 않고도 그것에 대해 생각하지 않을거야 . 거대한, 거대한 차이, 나는 알고있다. :) 감사합니다. – Mike

    0

    뭔가 :

    야그의 메시지 수에 대한
    $id = 12345 // Id for the user you are pulling messages for 
    $messages = Array(); 
    
    $result = mysql_query("SELECT sender_id, recepient_id, sent_time, read_time FROM messages WHERE sender_id = $id OR recepient_id = $id"); 
    
    while ($row = mysql_fect_assoc($result)) { 
    
        $directon = ($row['recepient_id'] == $id) ? 'to' : 'from'; 
        $isRead = ((bool)$row['read_time']); 
        .... 
        .... 
        $messages[] = Array($direction, $isRead ..........) 
    
    } 
    

    , 당신은 대화를 새 테이블을 만들거나 메시지의 집합을 만드는 것 지배 논리가 빠질 해결해야합니다 특정 대화.

    +0

    을 일단 난 아마 나중에이 업데이 트됩니다,하지만 내가 모든 주어진 사용자의 모든 메시지를 검색해야 할 것이다 의미 그는 자신의 사서함을 살펴 본다. 가능하다면 서버를 중단시키지 않기를 바란다. UNION 및 DISTINCT를 사용하여 쿼리를 만들려고했지만 길을 잃었습니다. 다른 방법은 내가 생각했던 몇 가지 쿼리에서 최신 메시지를 얻는 다음 PHP에서 배열을 결합하지만, 나는 다차원 배열을 정렬해야 할 거라고 그리고 나중에 여전히 많은 행을 두 번 같은 것을 검색하고 싶습니다. 필요합니다. :/ – Mike