2012-05-12 4 views
1

1 Gmail과 같은 대화 스레드가있는 메시지 테이블을 작성하려고합니다. (나는 PHP를 사용한다). 표는 그림과 같습니다. posID는, 지정된 threadID 내의 각 메세지의 위치를 ​​나타냅니다.다른 필드가있는 하나의 필드의 최대 값을 선택하는 mySQL 쿼리

id | senderID | recvrID | message(threadID,posID) | threadID | posID | time 
1  1   3   msg 1,1     1   1  12pm 
2  3   1   msg 1,2     1   2  3pm 
3  1   2   msg 2,1     2   1  1pm 

내가 할 수있는 ((이 경우) 센더 = 1 스레드에 하나 이상의 MSG를가있는 경우는, 각 스레드의 마지막 MSG를 선택 모든 MSG 스레드를 찾는 쿼리를 작성해야 위치 ID 또는 시간순으로 정렬).

예상 출력은 다음과 같은 표입니다.

senderID  | message     | Time 
    1    msg 1,2     3pm 
    1    msg 2,1     1pm 

편집 : 더 읽은 후, 나는 송신자/수신자 제약 메시지를 선택해야하고, (생각하는 경우 스레드에서 하나 이상의 메시지, 각 threadID에 대한 MAX (posID와 메시지 만)). 이것을 구현하는 방법을 모른다.

+0

은 원하는 결과를 표 형식으로 공유합니다. –

+0

출력은 다음과 같습니다. ______________________________________________________ senderID | 메시지 | 시간 ______________________________________________________ 1 msg 1,2 12pm 1 msg 2,1 1pm – aVC

+0

@Romil 질문을 예상 결과로 업데이트했습니다. – aVC

답변

1

나는 귀하의 질문에 오해의 소지가 생각 :

  • 는 당신이 실제로 userID=1이 보낸 사람 또는 수신기 중 모든 스레드가 필요합니다;
  • threadID=1posID=2 해당 시간은 3pm입니다. 사용자가 지정한대로 12pm이 아닙니다.

이 위치의에 의해 다음 쿼리는 당신에게 각 스레드의 마지막 메시지를 줄 것이다 :

SELECT senderID, recvrID, message, time 
    FROM message m 
    JOIN (SELECT threadID,max(posID) maxPOS FROM message 
     GROUP BY threadID) mm 
    ON m.threadID = mm.threadID AND m.posID = mm.maxPOS; 

다음과 같은 필터를 추가 할 수 있습니다 userID=1 만이다 메시지

  • WHERE senderID=1을 보내는 사람. 예 :과 일치하지 않습니다.
  • WHERE senderID=1 OR recvrID=1 모든 메시지에 대해 userID=1이 참여합니다. 예상되는 결과가 생성됩니다.

쿼리 here을보십시오.

하나의 메일에 여러 수신자가있는 경우에는 테이블에서 처리 할 수 ​​없습니다.

+0

@vyegorov하려면 솔루션이 효과적이었습니다. 미안하지만 내 질문에 예상되는 출력 섹션에서 오해의 소지가있는 데이터가있었습니다. msg 1,2 (오후 3시)에 대한 시간이 맞아서 업데이트했습니다. 또한, 일부 수정 된이 [link] (http://stackoverflow.com/a/4713912/903978)은 동일한 결과를 얻습니다. 그리고 내 응용 프로그램에는 여러 수신자가 없으므로 괜찮습니다. 감사합니다 - – aVC

+0

@aVC, 도움이되기를 바랍니다. – vyegorov

+0

@vyegorov하려면 이걸 도와 줄 수있어? 이 쿼리를 사용하고 있습니다. SELECT DISTINCT * FROM mail INNER JOIN (선택 threadID, 최대 시간 (time from FROM mail WHERE recipientID = "$ id"GROUP by threadID) 최근 ON mail.threadID = 최신 .threadID 및 mail.time = Latest.time 그러나 이것은 최신 날짜가 적힌 메시지가 맨 아래에 표시됩니다. 선택 사항을 시간순으로 정렬하는 방법을 알고 있습니까 (가장 먼저). – aVC

1

이 제품을 찾고 계 시나요?

$user = '1'; 
$q="SELECT * FROM tablename WHERE senderID = '$user'"; 
$r=mysql_query($q); 
while($w=mysql_fetch_array($r)){  
    $thread = $w['threadID']; 
    $id = $w['id']; 
    $message = $w['message']; 
    $q2="SELECT * FROM tablename WHERE threadID = '$thread'". 
     "ORDER BY posID DESC LIMIT 1"; 
    $r2=mysql_query($q2); 
    while($w2=mysql_fetch_array($r2)){ 
     $checkid = $w2['id']; 
     if($checkid != $id){ 
     $message = $w2['message']; 
     } 
    } 
    echo $message; 
} 
+0

Nikolas, 나는 당신의 코드를 점검하고 다시 게시 할 것이다. – aVC

+0

나는 그것을 시험해 보았지만, threadID가 두 개 이상인 경우에도 하나의 메시지 만 가져온다. – aVC

관련 문제