PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Consulta para obter as últimas conversas da caixa de entrada do usuário


De acordo com meu entendimento, você precisa receber a mensagem mais recente da conversa por usuário (das últimas 10 conversas mais recentes)

Atualização: Modifiquei a consulta para obter o latest_conversation_message_id para cada conversa do usuário

A consulta abaixo obtém os detalhes de user_id = 2 , você pode modificar, users.id = 2 para obtê-lo para qualquer outro usuário

SQLFiddle , espero que isso resolva seu propósito
SELECT
    user_id, 
    users.name, 
    users2.name as sent_from_or_sent_to,
    subquery.text as latest_message_of_conversation
FROM
    users
    JOIN
    (
    SELECT
        text,
        row_number() OVER ( PARTITION BY user_id + recipient_id ORDER BY id DESC) AS row_num,
        user_id,
        recipient_id,
        id
    FROM
        private_messages
    GROUP BY
        id,
        recipient_id,
        user_id,
        text
    ) AS subquery ON ( ( subquery.user_id = users.id OR subquery.recipient_id = users.id)  AND row_num = 1 )
    JOIN users as users2 ON ( users2.id = CASE WHEN users.id = subquery.user_id THEN subquery.recipient_id ELSE subquery.user_id END )
WHERE
    users.id = 2
ORDER BY
    subquery.id DESC
LIMIT 10

Informações: A consulta obtém a mensagem mais recente de cada conversa com qualquer outro usuário, se user_id 2 , envia uma mensagem para user_id 3 , que também é exibido, pois indica o início de uma conversa. A mensagem mais recente de cada conversa com qualquer outro usuário é exibida