sql >> Database teknologi >  >> RDS >> Mysql

MySQL:Få seneste besked fra 2 tabeller, der er forbundet med hinanden

I ældre versioner af MySQL (<8.0.2) kan vi bruge Afledte tabeller . I en afledt tabel kan vi få den seneste send_datetime værdi for hver conversation_id . Det er også bemærkelsesværdigt, at du kan angive dine filtre for conversation_id i WHERE klausul i denne underforespørgsel.

Vi kan derefter bruge denne underforespørgsels resultatsæt og slutte os tilbage til hovedtabellerne på passende vis for at få den række, der svarer til den seneste besked i en samtale.

Skema (MySQL v5.7)

Se på DB Fiddle

Forespørgsel #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;
 

Resultat

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

I MySQL 8.0.2 og nyere kan vi bruge Row_Number() funktionalitet. Indenfor en partition af conversation_id , vil vi bestemme rækkenummeret for hver besked, sorteret i faldende rækkefølge send_datetime . I denne underforespørgsel kan du angive dine filtre for conversation_id i WHERE klausul.

Vi vil derefter bruge dette resultatsæt som en afledt tabel og kun overveje de rækker, hvor rækkenummerværdien er 1 (da den vil tilhøre seneste send_datetime ).

Skema (MySQL v8.0)

Se på DB Fiddle

Forespørgsel #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;
 

Resultat

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

  1. Beregning af kumulativ sum i PostgreSQL

  2. 4 Fantastiske SQL Server-overvågningsressourcer til databaseadministratorer

  3. MySQL viser summen af ​​forskellen på to værdier

  4. Hvad er SQL Server Management Studio (SSMS)?