在 PHP/MySQL 消息系统中显示消息状态:已读和未读(与其他用户不同)

Displaying message status: read and unread (differs from other users) in PHP/MySQL messaging system

我正在显示与每个用户不同的消息状态。假设 user1user2 发送消息,user1 的消息状态然后设置为 read,而 user2 的消息设置为 unread 默认情况下。 user2 点击消息后将更新。

因此在这些情况下,user1 的消息(来自收件箱)将具有灰色字体,表示消息设置为 read(因为 user1是发送者)。另一方面,user2 有一个粗体字,表示消息是 unread.

这里是table的第一个结构:

message(messageid, fromid, toid, message, timestamp, status)

这里的问题是,如果我将消息状态更新为read,它会影响另一方(user2)。所以我添加了另一列,将设置不同于 user1user2:

的状态
message(messageid, fromid, toid, message, timestamp, from_status, to_status)

这里,from_status代表fromidto_status代表toid。但是我在如何使用这些值来显示状态方面遇到了问题。

我在第一次尝试时使用的 PHP 代码是这些:

<?php 
$id = $_SESSION['id'];
$query = mysql_query("SELECT m.* FROM message m
                                  LEFT JOIN message m2 ON (
                                  (m.fromid=m2.fromid AND m.toid=m2.toid) OR
                                  (m.fromid=m2.toid AND m.toid=m2.fromid)
                                  ) AND m.timestamp<m2.timestamp
                                  WHERE (m.fromid='$id' OR m.toid='$id') AND m2.toid IS NULL ORDER BY timestamp DESC");

while ($message = mysql_fetch_array($query)) {
  if ($message['status'] === 'unread') {
    // bold font style will be applied
  }
  else {
    // gray-colored font will be applied
  }
}
?>

(查询从具有最新对话的每个用户获取每个对话。)

这些代码对 user1 主用户工作正常,但会影响另一方,后者认为从 user2 收到的消息被设置为 read 或者unread.

所以,我在修改后的 table 上遇到了一些麻烦,每个用户都有 2 个单独的 status。我怎样才能完成这些?

@andrewsi 评论非常好,例如,当您有很多接收者时。在你的情况下,它只是一个额外的字段,所以在我看来,只使用一个 table 并不是溢出。 关于你的情况,你可以在一个简单的 sql:

中做到这一点
SELECT m.*,
    CASE 
        WHEN m.fromid = $id THEN m.from_status 
        WHEN m.toid = $id THEN m.to_status
    END as read_status
FROM message m
WHERE
    m.fromid = $id OR m.toid = $id
ORDER BY timestamp DESC;

并且在您看来,您只检查了 read_status 字段

(代表 OP 发布。)

感谢@Rafal Mnich,我已经设法解决了这个问题。所以我抓取了他查询的一部分并做了一些修改,它起作用了。

查询如下:

SELECT m.msgid, m.fromid, m.toid, m.content,
  CASE
    WHEN m.fromid = '$id' THEN m.frommsgstatus
    WHEN m.toid = '$id' THEN m.tomsgstatus
  END AS msgstatus
FROM msg m
  LEFT JOIN msg m2
    ON ((m.fromid=m2.fromid AND m.toid=m2.toid) OR (m.fromid=m2.toid AND m.toid=m2.fromid)) AND m.timestamp<m2.timestamp
WHERE (m.fromid='$id' OR m.toid='$id') AND m2.toid IS NULL
ORDER BY m.timestamp DESC

这些显示按发件人 fromid 分组的邮件,其中还显示您与每个发件人的最新对话。并在用户双方显示正确的消息状态。