Отображение статуса сообщения: прочитано и не прочитано (отличается от других пользователей) в системе обмена сообщениями PHP / MySQL

Я показываю статус сообщения, который отличается от каждого пользователя. Скажем user1 отправляет сообщение user2, user1статус сообщения затем устанавливается на read, в то время как user2сообщение установлено на unread по умолчанию. Будет обновлено после user2 нажимает на сообщение

Таким образом, в этом сценарии сообщение user1 (из папки «Входящие») будет иметь серый шрифт, который указывает, что сообщение установлено на read (поскольку user1 это тот, кто отправляет). На другой стороне, user2 иметь жирный шрифт, который указывает, что сообщение unread,

Вот первая структура таблицы:

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

Проблема в том, что если я обновлю статус сообщения на read, это влияет на другую сторону (user2). Поэтому я добавляю еще один столбец, который будет устанавливать статус, отличный от user1 а также user2:

message(messageid, fromid, toid, message, timestamp, from_status, to_status)

Вот, from_status для fromid а также to_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,

Итак, у меня возникли проблемы с тем, что делать на измененном столе, имея 2 отдельных status каждый для каждого пользователя. Как я могу это сделать?

0

Решение

Комментарий @andrewsi довольно хорош, когда у вас будет, например, много получателей. В вашем случае это только одно дополнительное поле, так что, на мой взгляд, использование одной таблицы не является чрезмерным.
Что касается вашего случая, вы можете сделать это одним простым 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 поле

2

Другие решения

(Опубликовано от имени ОП.)

Мне удалось решить проблему, благодаря @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, который также отображает последний разговор с каждым из отправителей. И он отображает правильный статус сообщения в обеих сторонах пользователей.

0

По вопросам рекламы [email protected]