Как узнать количество непрочитанных сообщений и последнее сообщение для каждого пользователя в запросе SQL? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть такая таблица сообщений:

message_id | body         | from_user_id | to_user_id | is_read | sent_date 
---------------------------------------------------------------------------
1          | hello        | 23           | 31         | false   | 2 min ago
---------------------------------------------------------------------------
2          | thank you    | 28           | 31         | true    | 4 min ago
---------------------------------------------------------------------------
3          | how are you? | 31           | 28         | false   | 1 min ago
---------------------------------------------------------------------------
4          | a-ha         | 29           | 31         | false   | 6 min ago

Я хочу получить количество непрочитанных сообщений и последнее сообщение для текущего пользователя (например, user_id 31)

требуемыйрезультат:

from_user_id | to_user_id | body         | sent_date | unread_message_count 
-------------------------------------------------------------------
23           | 31         | hello        | 2 min ago | 1
-------------------------------------------------------------------
31           | 28         | how are you? | 1 min ago | 0
-------------------------------------------------------------------
29           | 31         | a-ha         | 6 min ago | 1

Я использовал следующий код:

WITH ranked_messages AS (
    SELECT 
         messages.from_user_id, messages.to_user_id, 
         messages.body, messages.sent_date,
         ROW_NUMBER() OVER 
         (PARTITION BY messages.from_user_id 
         ORDER BY messages.sent_date DESC) AS message_rank
    FROM 
         messages
    WHERE 
         messages.to_user_id = 31 OR 
         messages.from_user_id = 31
)
SELECT * 
FROM ranked_messages 
WHERE message_rank = 1;

, но я хочу также unread_message_count для пользователя.

для примера:

select 
     count(*) as unread_message_count 
from 
     messages 
where 
     to_user_id = 31 and 
     is_read = false and 
     from_user_id = 23

Это должно быть рассчитано для каждого пользователя, отправляющего сообщения пользователю, и наоборот

Как мне достичь этого результата?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вы можете включить количество как вложенный запрос:

WITH ranked_messages AS (
    SELECT messages.from_user_id, messages.to_user_id, messages.body, messages.sent_date,
        select count(*) as unread_message_count from messages where (to_user_id = 31 or from_user_id = 31) and is_read = false,
        ROW_NUMBER() OVER (PARTITION BY messages.from_user_id ORDER BY messages.sent_date DESC) AS message_rank
    FROM messages
    WHERE messages.to_user_id = 31 OR messages.from_user_id = 31
)
SELECT * FROM ranked_messages WHERE message_rank = 1;
0 голосов
/ 26 октября 2018

Вы можете использовать оконные функции.Я думаю, что это логика:

WITH ranked_messages AS (
    SELECT m.from_user_id, m.to_user_id, m.body, m.sent_date,
           SUM(is_read::int) OVER (PARTITION BY from_user_id) as cnt
           ROW_NUMBER() OVER (PARTITION BY m.from_user_id ORDER BY m.sent_date DESC) AS message_rank
    FROM messages m
    WHERE 31 IN (m.to_user_id, m.from_user_id)
)
SELECT *
FROM ranked_messages
WHERE message_rank = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...