Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Holen Sie sich die neueste Nachricht von 2 Tabellen, die miteinander verknüpft sind

In älteren MySQL-Versionen (<8.0.2) können wir Abgeleitete Tabellen . In einer abgeleiteten Tabelle können wir die neueste send_datetime erhalten Wert für jede conversation_id . Bemerkenswert ist auch, dass Sie Ihre Filter für conversation_id im WHERE angeben können -Klausel dieser Unterabfrage.

Wir können dann die Ergebnismenge dieser Unterabfrage verwenden und entsprechend mit den Haupttabellen zurückverknüpfen, um die Zeile zu erhalten, die der letzten Nachricht in einer Konversation entspricht.

Schema (MySQL v5.7)

Auf DB Fiddle ansehen

Abfrage 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;

Ergebnis

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

In MySQL 8.0.2 und höher können wir Row_Number() verwenden Funktionalität. Innerhalb einer Partition von conversation_id , bestimmen wir die Zeilennummer für jede Nachricht, sortiert in absteigender Reihenfolge von send_datetime . In dieser Unterabfrage können Sie Ihre Filter für "conversation_id" im WHERE angeben Klausel.

Wir werden diese Ergebnismenge dann als abgeleitete Tabelle verwenden und nur die Zeilen berücksichtigen, bei denen der Wert der Zeilennummer 1 ist (da er zum letzten send_datetime gehört ).

Schema (MySQL v8.0)

Auf DB Fiddle ansehen

Abfrage 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;

Ergebnis

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