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

MySQL:Dapatkan pesan terbaru dari 2 tabel yang terkait satu sama lain

Di versi MySQL yang lebih lama (<8.0.2), kita dapat menggunakan Tabel Turunan . Dalam tabel Derived, kita bisa mendapatkan send_datetime terbaru nilai untuk setiap conversation_id . Selain itu, perlu diperhatikan bahwa Anda dapat menyediakan filter untuk percakapan_id di WHERE klausa subkueri ini.

Kami kemudian dapat menggunakan kumpulan hasil subquery ini dan bergabung kembali ke tabel utama dengan tepat, untuk mendapatkan baris yang sesuai dengan pesan terbaru dalam percakapan.

Skema (MySQL v5.7)

Lihat di DB Fiddle

Kueri #1

SELECT
  amc.conversation_id, 
  m.message_id, 
  m.message   
FROM 
  assoc_message__conversation AS amc
JOIN message AS m 
  ON m.message_id = amc.message_id 
JOIN 
(
  SELECT
    amc1.conversation_id, 
    MAX(m1.send_datetime) AS latest_send_datetime
  FROM
   assoc_message__conversation AS amc1
  JOIN message AS m1
    ON m1.message_id = amc1.message_id 
  WHERE amc1.conversation_id IN (1,2)  -- Here you provide your input filters
  GROUP BY amc1.conversation_id
) AS dt  
  ON dt.conversation_id = amc.conversation_id AND 
     dt.latest_send_datetime = m.send_datetime;

Hasil

| conversation_id | message_id | message        |
| --------------- | ---------- | -------------- |
| 1               | 3          | Latest message |
| 2               | 6          | Latest message |

Di MySQL 8.0.2 dan di atasnya, kita bisa menggunakan Row_Number() Kegunaan. Dalam partisi conversation_id , kami akan menentukan Nomor Baris untuk setiap pesan, diurutkan dalam urutan send_datetime . Dalam subkueri ini, Anda dapat memberikan filter untuk percakapan_id di WHERE klausa.

Kami kemudian akan menggunakan kumpulan hasil ini sebagai Tabel Turunan, dan hanya mempertimbangkan baris tersebut, di mana nilai Nomor Baris adalah 1 (karena akan menjadi milik send_datetime terbaru ).

Skema (MySQL v8.0)

Lihat di DB Fiddle

Kueri #2

SELECT 
  dt.conversation_id, 
  dt.message_id, 
  dt.message 
FROM 
(
  SELECT
    amc.conversation_id, 
    m.message_id, 
    m.message, 
    ROW_NUMBER() OVER (PARTITION BY amc.conversation_id 
                       ORDER BY m.send_datetime DESC) AS row_no 
  FROM
   assoc_message__conversation AS amc
  JOIN message AS m
    ON m.message_id = amc.message_id 
  WHERE amc.conversation_id IN (1,2)  -- Here you provide your input filters
) AS dt  
WHERE dt.row_no = 1;

Hasil

| conversation_id | message_id | message        |
| --------------- | ---------- | -------------- |
| 1               | 3          | Latest message |
| 2               | 6          | Latest message |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL menghapus catatan duplikat tetapi tetap terbaru

  2. Data terlalu panjang untuk kolom di Django di MySQL

  3. Menggunakan konektor dengan Kafka/Confluent yang terpasang di Helm

  4. Bagaimana cara membuat website dengan Java?

  5. Subkueri vs bergabung