PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfrage zum Abrufen der letzten Unterhaltungen für den Posteingang des Benutzers

Nach meinem Verständnis müssen Sie die neueste Nachricht der Konversation auf Benutzerbasis erhalten (der letzten 10 letzten Konversationen)

Aktualisierung: Ich habe die Abfrage geändert, um die latest_conversation_message_id zu erhalten für jede Benutzerkonversation

Die folgende Abfrage ruft die Details für user_id = 2 ab , können Sie ändern, users.id = 2 um es für jeden anderen Benutzer zu bekommen

SQLFiddle , ich hoffe, das löst Ihren Zweck

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

Info: Die Abfrage ruft die neueste Nachricht jeder Konversation mit einem beliebigen anderen Benutzer ab, wenn user_id 2 , sendet eine Nachricht an user_id 3 , das wird ebenfalls angezeigt, da es den Beginn eines Gesprächs anzeigt. Die neueste Nachricht jeder Konversation mit einem beliebigen anderen Benutzer wird angezeigt