1

1我正在尝试使用 gmail 之类的对话线程编写消息表。(我使用 php)。表格如图所示。posID 表示给定 threadID 中每条消息的位置。

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

我需要编写一个查询来查找所有 msg 线程到 senderID=1(在这种情况下),如果一个线程中有多个 msg,则仅在每个线程中选择最后一个 msg(可以按 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=1对于userID=1只有发件人的消息。但是,这与您的样本不匹配
  • WHERE senderID=1 OR recvrID=1对于所有消息,在哪里userID=1参与。这将产生预期的结果。

试试这里的查询。

请注意,您的表格将无法处理一封邮件有多个收件人的情况。

于 2012-05-12T18:41:39.933 回答