PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara mendapatkan pesan terbaru di setiap percakapan pengguna tertentu di SQL?

Dengan asumsi pengguna dengan ID 1 dan 3 , seperti yang Anda lakukan di biola, kami tertarik dengan pesan dengan created_at terbaru dan (sender_id, receiver_id) menjadi (1,3) atau (3,1) .

Anda dapat menggunakan jenis baris ad-hoc untuk mempersingkat sintaks:

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

Atau secara eksplisit (dan sedikit lebih cepat, juga lebih mudah digunakan dengan indeks):

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;

Untuk semua percakapan pengguna

Menambahkan solusi sesuai permintaan di komentar.

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;

Pendekatan di sini adalah melipat pengirim/penerima asing menjadi satu kolom untuk menyederhanakan ekstraksi baris terakhir.

Penjelasan mendetail untuk DISTINCT ON dalam jawaban terkait ini:
Pilih baris pertama di setiap grup GROUP BY?

-> SQLfiddle Diperbarui .

Pertimbangkan juga kasus uji yang ditingkatkan dan disederhanakan di biola.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql - Bagaimana cara mengekstrak kemunculan pertama substring dalam string menggunakan pola ekspresi reguler?

  2. Bagaimana cara mengonversi objek NaN numpy ke SQL nulls?

  3. ImportError saat menjalankan cgi-bin di localhost - simbol tidak terdefinisi:lo_truncate64

  4. Menangani Query Lambat Dengan PostgreSQL

  5. Apa yang dimaksud dengan %% dalam PL/pgSQL?