sql >> Database >  >> RDS >> Mysql

MySQL:ontvang het laatste bericht van 2 tabellen die aan elkaar zijn gekoppeld

In oudere versies van MySQL (<8.0.2) kunnen we Afgeleide tabellen . In een afgeleide tabel kunnen we de laatste send_datetime . krijgen waarde voor elke conversation_id . Het is ook opmerkelijk dat u uw filters voor conversation_id kunt opgeven in de WHERE clausule van deze subquery.

We kunnen dan de resultatenset van deze subquery gebruiken en op de juiste manier teruggaan naar de hoofdtabellen om de rij te krijgen die overeenkomt met het laatste bericht in een gesprek.

Schema (MySQL v5.7)

Bekijken op DB Fiddle

Vraag #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;

Resultaat

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

In MySQL 8.0.2 en hoger kunnen we Row_Number() gebruiken functionaliteit. Binnen een partitie van conversation_id , zullen we het rijnummer voor elk bericht bepalen, gesorteerd in aflopende volgorde van send_datetime . In deze subquery kunt u uw filters voor conversation_id opgeven in de WHERE clausule.

We zullen deze resultaatset dan gebruiken als een afgeleide tabel, en alleen die rijen beschouwen, waar de rijnummerwaarde 1 is (omdat deze zal behoren tot de laatste send_datetime ).

Schema (MySQL v8.0)

Bekijken op DB Fiddle

Vraag #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;

Resultaat

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


  1. Een door de gebruiker gedefinieerde gegevenstype-alias maken in SQL Server met behulp van T-SQL

  2. op zoek naar een kleine variant van GROUP BY

  3. Kan MySQL-container niet verbinden met Tomcat-container in docker

  4. Waarschuwing:PDO::exec() verwacht dat parameter 1 string is