PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zapytanie o ostatnie rozmowy do skrzynki odbiorczej użytkownika

Zgodnie z moim zrozumieniem, musisz otrzymać najnowszą wiadomość z rozmowy na użytkownika (z ostatnich 10 ostatnich rozmów)

Aktualizacja: Zmodyfikowałem zapytanie, aby uzyskać latest_conversation_message_id za każdą rozmowę użytkownika

Poniższe zapytanie pobiera szczegóły dla user_id = 2 , możesz zmodyfikować, users.id = 2 aby otrzymać go dla każdego innego użytkownika

SQLFiddle , mam nadzieję, że to rozwiąże Twój cel

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

Informacje: Zapytanie pobiera najnowszą wiadomość z każdej rozmowy z dowolnym innym użytkownikiem, Jeśli user_id 2 , wysyła wiadomość do user_id 3 , który również jest wyświetlany, ponieważ wskazuje początek rozmowy. Wyświetlana jest najnowsza wiadomość z każdej rozmowy z dowolnym innym użytkownikiem



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak znaleźć wszystkie wiersze z wartością NULL w dowolnej kolumnie za pomocą PostgreSQL?

  2. Upuść ograniczenie według nazwy w Postgresql

  3. Postgres - usuń element z tablicy jsonb

  4. @BatchSize inteligentne czy głupie zastosowanie?

  5. c++ konwertuj znacznik czasu postgres bez strefy czasowej na time_t