sql >> Base de Datos >  >> RDS >> PostgreSQL

Consulta para obtener las últimas conversaciones para la bandeja de entrada del usuario

Según tengo entendido, debe obtener el último mensaje de la conversación por usuario (de las últimas 10 conversaciones más recientes)

Actualización: He modificado la consulta para obtener el latest_conversation_message_id para cada conversación de usuario

La siguiente consulta obtiene los detalles de user_id = 2 , puede modificar, users.id = 2 para obtenerlo para cualquier otro usuario

SQLFiddle , espero que esto resuelva tu 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

Información: La consulta obtiene el último mensaje de cada conversación con cualquier otro usuario, si user_id 2 , envía un mensaje a user_id 3 , que también se muestra, ya que indica el inicio de una conversación. Se muestra el último mensaje de cada conversación con cualquier otro usuario