mySQL查询选择一个字段的最大值与另一个字段common

时间:2012-05-12 08:28:24

标签: mysql

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

我需要编写一个查询来查找发送方ID = 1的所有msg线程(在本例中),如果一个线程中有多个消息,请在每个线程中选择最后一个消息(可以按positionID排序或时间)。

预期输出表如下。

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

编辑: 在更多阅读之后,我想我需要选择具有发送方/接收方约束的消息,AND(如果线程中有多条消息,则只有那些具有MAX(posID)的消息用于每个threadID)。不知道如何实现这一点。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;

您可以添加以下过滤条件:

  • WHERE senderID=1表示userID=1只是发件人的邮件。 虽然;
  • ,但这与您的样本不符
  • WHERE senderID=1 OR recvrID=1用于userID=1参与的所有邮件。 这将产生预期的结果。

尝试查询here

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