SQL для отображения количества непрочитанных сообщений ... включая непрочитанные ответы - PullRequest
0 голосов
/ 23 марта 2011

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

Мне нужен способ выяснить, является ли основное сообщение или какое-либо из его ответных сообщений непрочитанными.

У меня есть таблица с названием "messages", которая имеет поля: идентификатор, активный [1,0], тема, сообщение, дата и время, user_from, user_to, ответ, просмотрено, удалено

Когда сообщение читается, я сохраняю этот идентификатор пользователя с разделителями-запятыми в поле просмотра: , 3,4,12,

Затем, чтобы выяснить, просматривается ли он, я ищу идентификатор отправителя следующим образом:

m.viewed LIKE '%,$user_id,%'

Я просто выясняю, как включить эту логику в этот SQL-выбор, чтобы я мог видеть, должно ли родительское сообщение быть помечено как непрочитанное. Следующий SQL отлично работает, захватывает все сообщения и количество ответов и упорядочивает их по дате / времени.

SELECT m.*, COUNT(*) AS num_replies, MAX(r.datetime) AS max_datetimeunread_replies
FROM directus_messages AS m
LEFT JOIN directus_messages as r
    ON m.id = r.reply
WHERE m.active = '1' 
AND m.removed NOT LIKE '%,$user_id,%' 
GROUP BY m.id
HAVING m.reply = '0' 
ORDER BY datetime DESC, max_datetime DESC

Любая помощь будет принята с благодарностью ... Я не могу обернуть голову вокруг нее!

1 Ответ

1 голос
/ 23 марта 2011

Вы должны проверить эту статью: Управление иерархическими данными в MySQL

- EDIT - UPDATE

ОК, у вас есть только 1 уровень ответов, поэтому нет необходимости в вышеуказанном.

Попробуйте это:

SELECT m.*
     , COUNT(*) AS num_replies
     , MAX(r.datetime) AS max_datetime
     , (m.viewed LIKE '%,$user_id,%') 
         AS message_viewed    --shows True or False
     , SUM(r.viewed NOT LIKE '%,$user_id,%')
         AS unread_replies    --shows number of unread replies
FROM directus_messages AS m
  LEFT JOIN directus_messages as r
    ON m.id = r.reply
WHERE m.active = '1' 
  AND m.removed NOT LIKE '%,$user_id,%' 
GROUP BY m.id
HAVING m.reply = '0' 
ORDER BY m.datetime DESC
       , max_datetime DESC
;
...