PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy vấn để nhận các cuộc trò chuyện cuối cùng cho hộp thư đến của người dùng

Theo sự hiểu biết của tôi, bạn cần nhận được thông báo mới nhất của cuộc trò chuyện trên cơ sở mỗi người dùng (trong số 10 cuộc trò chuyện gần đây nhất)

Cập nhật: Tôi đã sửa đổi truy vấn để lấy latest_conversation_message_id cho mọi cuộc trò chuyện của người dùng

Truy vấn dưới đây lấy thông tin chi tiết cho user_id = 2 , bạn có thể sửa đổi, users.id = 2 để tải nó cho bất kỳ người dùng nào khác

SQLFiddle , hy vọng điều này giải quyết được mục đích của bạn

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

Thông tin: Truy vấn nhận thông báo mới nhất của mọi cuộc trò chuyện với bất kỳ người dùng nào khác, If user_id 2 , gửi tin nhắn tới user_id 3 , điều đó cũng được hiển thị, vì nó cho biết sự bắt đầu của một cuộc trò chuyện. Thông báo mới nhất của mọi cuộc trò chuyện với bất kỳ người dùng nào khác được hiển thị



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi khóa chính trong bảng PostgreSQL

  2. Ngăn chặn kích hoạt đệ quy trong PostgreSQL

  3. Đếm ký tự trong chuỗi thông qua SQL

  4. Trích dẫn tên cột bằng NHibernate và PostgreSQL

  5. Truy vấn postgres chậm khi tham gia các bảng lớn