Я показываю статус сообщения, который отличается от каждого пользователя. Скажем 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
каждый для каждого пользователя. Как я могу это сделать?
Комментарий @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 поле
(Опубликовано от имени ОП.)
Мне удалось решить проблему, благодаря @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
, который также отображает последний разговор с каждым из отправителей. И он отображает правильный статус сообщения в обеих сторонах пользователей.