1

1gmail のような会話スレッドでメッセージ テーブルを書き込もうとしています。(私はphpを使用しています)。表はご覧の通り。posID は、特定のスレッド ID 内の各メッセージの位置を意味します。

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

senderID=1 (この場合) のすべてのメッセージ スレッドを検索するクエリを作成する必要があります。スレッドに複数のメッセージがある場合は、各スレッドで最後のメッセージのみを選択します (positionID または時間で並べ替えることができます)。

期待される出力は次の表のとおりです。

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

編集:さらに読んだ後、送信者/受信者の制約を持つメッセージを選択する必要があると思います(スレッド内に複数のメッセージがある場合、各スレッドIDにMAX(posID)を持つメッセージのみ)。これを実装する方法がわかりません。

4

2 に答える 2

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;
}
于 2012-05-12T08:34:19.897 に答える
1

あなたの質問は誤解を招くと思います:

  • 実際にuserID=1は、送信者または受信者のいずれかであるすべてのスレッドが必要です。
  • forthreadID=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;

次のフィルターを追加できます。

  • WHERE senderID=1userID=1が送信者のみのメッセージの場合。ただし、これはサンプルと一致しません
  • WHERE senderID=1 OR recvrID=1が参加しているすべてのメッセージについてuserID=1これにより、期待される結果が得られます。

ここでクエリを試してください。

テーブルは、1 つのメッセージに複数の受信者がいる場合を処理できないことに注意してください。

于 2012-05-12T18:41:39.933 に答える