2012-08-12 5 views
0

Facebook과 같은 메시지 목록을 만들려고합니다. (1 행) 메시지를 SQL에서 메시지 목록 만들기

  1. 은 (역사)는 사용자의 대화에서 메시지를 마지막으로 만 표시 나는 쇼 광산을 보낼 때 내가 얻을 때
  2. 는 대답 쇼 대답

데이터베이스 데이터 :

enter image description here

SQL 쿼리

SELECT m.message_id, u.username, m.subject, m.message 
    , m.status, UNIX_TIMESTAMP(m.date) as date 
    FROM users u 
    LEFT JOIN messages m ON m.sender_id = u.id 
WHERE m.message_id in (SELECT max(msg.message_id) 
          FROM messages msg 
         WHERE msg.receiver_id = 3 
         GROUP BY sender_id) 
UNION 
SELECT m.message_id, u.username, m.subject, m.message 
    , m.status, UNIX_TIMESTAMP(m.date) as date 
    FROM users u 
    LEFT JOIN messages m ON m.receiver_id = u.id 
WHERE m.message_id in (SELECT max(msg.message_id) 
          FROM messages msg 
         WHERE msg.sender_id = 3 
         GROUP BY receiver_id) 
GROUP BY u.username 
ORDER BY date DESC 

내가 보낸 모든 메시지를 수신하려고 (내 ID = 3) 사용자 이름

SQL 결과가 나와 그룹에 전송 된 모든 :

Array 
(
    [0] => Array 
     (
      [message_id] => 10 
      [username] => 8888 
      [subject] => без темы 
      [message] => 555 
      [status] => 0 
      [date] => 11 August 2012, 2:22 
      [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg 
     ) 

    [1] => Array 
     (
      [message_id] => 7 
      [username] => 8888 
      [subject] => hi 
      [message] => 333 
      [status] => 0 
      [date] => 11 August 2012, 2:15 
      [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg 
     ) 

    [2] => Array 
     (
      [message_id] => 4 
      [username] => 6666 
      [subject] => Тема 
      [message] => 2 
      [status] => 0 
      [date] => 11 August 2012, 2:02 
      [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg 
     ) 

    [3] => Array 
     (
      [message_id] => 1 
      [username] => fffffffff 
      [subject] => privet 
      [message] => tttt 
      [status] => 0 
      [date] => 11 August 2012, 1:38 
      [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg 
     ) 

) 

GROUP BY 사용자 이름이 작동하지 않는 것을 볼 수 있습니다. 그것은 3-> 7과 7-> 3을 보여 주지만 7-> 3은 대답과 마지막 메시지였습니다. 왜 그룹이 작동하지 않는지 모르겠다. 어쩌면이 문제를 해결하는 더 쉬운 방법을 통해 나를 도울 수 있습니까? > 1

  • MESSAGE_ID - -> 4
  • MESSAGE_ID

    그래서, SQL이 있어야합니다 "SENDER_ID = 3", "receiver_id = 3"내 테이블 데이터 결과에서

    • MESSAGE_ID해야합니다 -> 10
  • +1

    SQL 질문이있는 경우 멋진 http://sqlfiddle.com/에서 수정할 수있는 테스트 케이스를 준비 할 수 있습니다. – biziclop

    답변

    1

    일부 대화에서 마지막 메시지를보고 싶은 경우 질문이 "올바른"결과를 생성하고 있다고 생각합니다. 실제로는 conversation_id으로 그룹화해야합니다. 나는이 분야를 당신의 스키마에서 보지 못했다.

    WHERE sender_id = 3 GROUP BY receiver_id을 입력하면 메시지 1과 7이 반환됩니다. '해당 메시지가 명의 다른 사람에게 전송 되었기 때문에 명의 사람들이 서로 다른 대화를 나눕니다.

    일반적으로 가장 최근 메시지 만 보려는 경우 UNION의 두 번째 부분에서 GROUP BY을 제거하면됩니다. 그렇지 않으면 스키마를 다시 설계하는 것을 고려하십시오.


    편집 :

    SELECT m.message_id, u.username, m.subject, m.message, 
         m.status, UNIX_TIMESTAMP(m.date) as `date` 
        FROM users u 
        LEFT JOIN messages m ON m.sender_id = u.id 
    WHERE m.message_id IN (
        SELECT max(message_id) 
         FROM messages 
        WHERE receiver_id = 3 OR sender_id = 3 
        GROUP BY least(sender_id,receiver_id), 
           greatest(sender_id,receiver_id) 
        ); 
    

    일부 노트 :

    이 쿼리를 시도

    1. UNION

      더 이상 필요하지 않습니다;
    2. 이 방법은 두 당사자 사이의 모든 전자 메일을 단일 대화로 처리하므로 항상 그렇지는 않습니다.이 접근 방식을 다시 설계 할 수도 있습니다.
    3. 열 이름이나 별칭에 예약어 (예 : date)를 사용하는 것은 좋지 않은 스타일이므로이 문제를 피하십시오. 또는 백틱을 사용하는 경우 백틱을 사용하십시오.
    +0

    한 명의 사용자에게 하나의 대화가 필요하므로 여기에 여전히 ID가있는 사용자가 문제가됩니다. (1)은 (3) conversation_id에 쓰고 ... 3 - 1이면 id = 1은 목록을 보여 주며 마지막 메시지가 아닌 3-> 1, 1-> 3이됩니다. – Viktors

    +0

    @ViktorsGolubevs, answer 업데이트되었습니다. 오우거의 인사말 :) – vyegorov