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

Làm thế nào để nhận được thông báo mới nhất trong mỗi cuộc trò chuyện của một người dùng nhất định trong SQL?

Giả sử người dùng có ID 13 , giống như bạn đã làm trong trò chơi, chúng tôi quan tâm đến thông báo có created_at mới nhất và (sender_id, receiver_id)(1,3) hoặc (3,1) .

Bạn có thể sử dụng các loại hàng đặc biệt để tạo cú pháp ngắn gọn:

SELECT * 
FROM   messages 
WHERE  (sender_id, receiver_id) IN ((1,3), (3,1))
ORDER  BY created_at DESC
LIMIT  1;

Hoặc rõ ràng (và nhanh hơn một chút, cũng dễ sử dụng hơn với các chỉ mục):

SELECT * 
FROM   messages 
WHERE (sender_id = 1 AND receiver_id = 3 OR
       sender_id = 3 AND receiver_id = 1)
ORDER  BY created_at DESC
LIMIT  1;

Cho tất cả cuộc trò chuyện của một người dùng

Đã thêm giải pháp theo yêu cầu trong bình luận.

SELECT DISTINCT ON (user_id) *
FROM (
   SELECT 'out' AS type, id, receiver_id AS user_id, body, created_at
   FROM   messages 
   WHERE  sender_id = 1

   UNION  ALL
   SELECT 'in' AS type, id, sender_id AS user_id, body, created_at
   FROM   messages 
   WHERE  receiver_id = 1
   ) sub
ORDER  BY user_id, created_at DESC;

Cách tiếp cận ở đây là gấp người gửi / người nhận nước ngoài thành một cột để đơn giản hóa việc trích xuất hàng cuối cùng.

Giải thích chi tiết cho DISTINCT ON trong câu trả lời có liên quan này:
Chọn hàng đầu tiên trong mỗi GROUP BY nhóm?

-> SQLfiddle được cập nhật .

Ngoài ra, hãy xem xét trường hợp thử nghiệm được cải tiến và đơn giản hóa trong fiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo toán tử bình đẳng tùy chỉnh cho kiểu PostgreSQL (điểm) cho các cuộc gọi DISTINCT

  2. câu hỏi về các biến liên kết postgresql

  3. Kiểm tra cú pháp PostgreSQL mà không cần chạy truy vấn

  4. Postgres:Thêm ràng buộc nếu nó chưa tồn tại

  5. Tính DATEDIFF trong POSTGRES bằng SQLAlchemy