Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menanyakan percakapan dari tabel pesan

Jika saya memahami kebutuhan Anda dengan benar, Anda ingin mendapatkan tanggal pesan terbaru untuk setiap percakapan yang melibatkan pengguna tertentu. Dalam hal ini, kami dapat menggabungkan percakapan untuk pengguna tertentu dan mempertahankan tanggal pesan terbaru.

SELECT m1.*
FROM messages m1
INNER JOIN
(
    SELECT LEAST(sender_id, recipient_id)    AS first,
           GREATEST(sender_id, recipient_id) AS second,
           MAX(created_at) AS recent_date
    FROM messages
    WHERE sender_id = 2 OR recipient_id = 2
    GROUP BY LEAST(sender_id, recipient_id),
             GREATEST(sender_id, recipient_id)
) m2
    ON LEAST(m1.sender_id, m1.recipient_id)    = m2.first AND
       GREATEST(m1.sender_id, m1.recipient_id) = m2.second AND
       m1.created_at = m2.recent_date

Keluaran:

Penjelasan:

Tantangan dalam kueri ini adalah menemukan cara untuk mengelompokkan percakapan antara dua pengguna secara bersamaan. Saya menggunakan LEAST/GREATEST trik, yang merupakan cara kita dapat memperlakukan 2 -> 4 dan 4 -> 2 percakapan sebagai hal yang sama secara logis. Kemudian, menggunakan GROUP BY , kami dapat mengidentifikasi tanggal percakapan terbaru untuk pasangan pengguna percakapan tersebut. Jadi subquery dalam jawaban saya di atas menemukan, untuk setiap pasangan pengguna, tanpa memperhatikan urutan apa pun, pasangan itu bersama dengan tanggal percakapan terbarunya. Kami kemudian menggabungkan hasil ini kembali ke messages tabel untuk memasukkan teks pesan terbaru yang sebenarnya.

Demo di sini:

Penguji Ulang



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara memperbarui MySQL secara OTOMATIS setelah bidang stempel waktu berakhir

  2. MySQL:Ringkas semua jumlah baris tabel dalam satu kueri

  3. Lihat file yang disimpan dalam database menggunakan php di browser

  4. Django + MySQL di Elastic Beanstalk - Kesalahan Saat Meminta MySQL

  5. Cuplikan volume EBS yang digunakan untuk replikasi