Запрос - отправка публичных и личных сообщений пользователям - PullRequest
2 голосов
/ 07 февраля 2012

Необходимо реализовать доставку общедоступных сообщений для всех пользователей и личных сообщений.

Упрощенные таблицы:

messages
+---------------+---------------------------+
| Field         | Type                      |
+---------------+---------------------------+
| id            | int(10) unsigned          |
| admin_id      | int(10) unsigned          |
| type          | enum('public','targeted') |
| subject       | text                      |
+---------------+---------------------------+

messages_read_status
+----------------+---------------------------------+
| Field          | Type                            |
+----------------+---------------------------------+
| id             | int(10) unsigned                |
| message_id     | int(10) unsigned                |
| user_id        | int(10) unsigned                |
| status         | enum('unread','read')           |
+----------------+---------------------------------+

При отправке общедоступных сообщений - в messages_read_status записи таблицы не созданы.Для целевых сообщений - создание записи с непрочитанным статусом.Когда сообщение читается пользователем - настройка read status.

Два фильтра на стороне клиента - Read / Unread.Сообщение тип не имеет значения для пользователя.

Основная задача - создать запрос для запроса прочитанных или непрочитанных сообщений для пользователя независимо от типа сообщения.

Основная проблема заключается в обработке запроса запроса для открытых непрочитанных сообщений, поскольку в них не может быть записей в messages_read_status .UNREAD-запрос работает правильно, пока какой-то пользователь читает сообщение.Затем создается новая запись в messages_read_status , и другие пользователи больше не могут видеть это сообщение.Эту ситуацию я не могу разрешить.Запрос READ работает правильно.

SELECT  messages.* FROM messages
LEFT JOIN messages_read_status 
ON messages.id = messages_read_status.message_id
WHERE
{OTHER FILTERS} AND
(messages_read_status.`id` IS NULL OR (messages_read_status.`user_id` = $user_id  AND messages_read_status.`message_status` = '$message_status'))

samlpe sql - http://sqlfiddle.com/#!2/d940d

Спасибо

1 Ответ

1 голос
/ 09 февраля 2012

Способ получить непрочитанное (общедоступный + целевой)

SELECT  messages.* FROM messages
LEFT JOIN messages_read_status
ON (
    messages.id = messages_read_status.message_id AND
    messages_read_status.`user_id` = $user_id
)
WHERE
{OTHER FILTERS} AND
((messages_read_status.`id` IS NULL AND messages.type='public') OR messages_read_status.`status` = 'unread')

И для чтения, используя более простые правила

{OTHER FILTERS} AND messages_read_status.`user_id` = $user_id AND messages_read_status.`status` = 'read'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...