sql >> Databáze >  >> RDS >> Mysql

MySQL:Získejte nejnovější zprávu ze 2 tabulek, které jsou vzájemně propojeny

Ve starších verzích MySQL (<8.0.2) můžeme použít Odvozené tabulky . V odvozené tabulce můžeme získat nejnovější send_datetime hodnotu pro každý conversation_id . Je také pozoruhodné, že své filtry pro id konverzace můžete poskytnout v WHERE klauzule tohoto dílčího dotazu.

Poté můžeme použít sadu výsledků tohoto poddotazu a vhodně se připojit zpět k hlavním tabulkám, abychom získali řádek odpovídající poslední zprávě v konverzaci.

Schéma (MySQL v5.7)

Zobrazit na DB Fiddle

Dotaz č. 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;

Výsledek

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

V MySQL 8.0.2 a novějších můžeme použít Row_Number() funkčnost. V rámci oddílu conversation_id , určíme číslo řádku pro každou zprávu, seřazenou v sestupném pořadí send_datetime . V tomto dílčím dotazu můžete zadat své filtry pro id konverzace v WHERE doložka.

Tuto sadu výsledků pak použijeme jako odvozenou tabulku a vezmeme v úvahu pouze ty řádky, kde hodnota čísla řádku je 1 (protože bude patřit k nejnovějšímu send_datetime ).

Schéma (MySQL v8.0)

Zobrazit na DB Fiddle

Dotaz č. 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;

Výsledek

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


  1. Jak funguje sp_describe_first_result_set na serveru SQL Server

  2. PSQLException:aktuální transakce je přerušena, příkazy ignorovány až do konce bloku transakce

  3. Jak získat velikost blob v PHP nebo SQL

  4. Tabulky, jejichž jediným účelem je určit podmnožinu jiné tabulky