sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Få senaste meddelandet från 2 tabeller som är associerade med varandra

I äldre versioner av MySQL (<8.0.2) kan vi använda Härledda tabeller . I en härledd tabell kan vi få den senaste send_datetime värde för varje conversation_id . Det är också anmärkningsvärt att du kan tillhandahålla dina filter för konversations-id i WHERE klausul i denna underfråga.

Vi kan sedan använda den här underfrågans resultatuppsättning och gå tillbaka till huvudtabellerna på lämpligt sätt för att få raden som motsvarar det senaste meddelandet i en konversation.

Schema (MySQL v5.7)

Visa på DB Fiddle

Fråga #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 och senare kan vi använda Row_Number() funktionalitet. Inom en partition av conversation_id , kommer vi att bestämma radnummer för varje meddelande, sorterat i fallande ordning send_datetime . I den här underfrågan kan du ange dina filter för konversations-id i WHERE klausul.

Vi kommer sedan att använda denna resultatuppsättning som en härledd tabell och överväga endast de rader där radnummervärdet är 1 (eftersom det kommer att tillhöra senaste send_datetime ).

Schema (MySQL v8.0)

Visa på DB Fiddle

Fråga #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. Hur binder man parametrar till en rå DB-fråga i Laravel som används på en modell?

  2. Hur ATAN() fungerar i MariaDB

  3. Använd accentkänslig primärnyckel i MySQL

  4. MySQL kapslade resurser (pivottabeller) behörighet att visa/uppdatera/hantera