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)。不知道如何实现这一点。
答案 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=1
且posID=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。
请注意,您的表格无法处理一封邮件中有多个收件人的情况。