PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Requête pour obtenir les dernières conversations pour la boîte de réception de l'utilisateur

Selon ma compréhension, vous devez obtenir le dernier message de la conversation par utilisateur (sur les 10 dernières conversations)

Mise à jour : J'ai modifié la requête pour obtenir le latest_conversation_message_id pour chaque conversation utilisateur

La requête ci-dessous obtient les détails pour user_id = 2 , vous pouvez modifier, users.id = 2 pour l'obtenir pour n'importe quel autre utilisateur

SQLFiddle , j'espère que cela résout votre problème

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

Information : La requête obtient le dernier message de chaque conversation avec n'importe quel autre utilisateur, si user_id 2 , envoie un message à user_id 3 , qui s'affiche également, car il indique le début d'une conversation. Le dernier message de chaque conversation avec n'importe quel autre utilisateur est affiché