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?
Pertimbangkan juga kasus uji yang ditingkatkan dan disederhanakan di biola.