Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:pobierz najnowszą wiadomość z 2 powiązanych ze sobą tabel

W starszych wersjach MySQL (<8.0.2) możemy użyć Tabele pochodne . W tabeli pochodnej możemy uzyskać najnowsze send_datetime wartość dla każdego conversation_id . Warto również zauważyć, że możesz podać filtry dla konwersacji_id w WHERE klauzula tego podzapytania.

Następnie możemy użyć zestawu wyników tego podzapytania i odpowiednio dołączyć z powrotem do głównych tabel, aby uzyskać wiersz odpowiadający ostatniej wiadomości w rozmowie.

Schemat (MySQL v5.7)

Wyświetl na DB Fiddle

Zapytanie nr 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;

Wynik

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

W MySQL 8.0.2 i nowszych możemy użyć Row_Number() funkcjonalność. W partycji conversation_id , określimy numer wiersza dla każdej wiadomości, posortowany w porządku malejącym od send_datetime . W tym podzapytaniu możesz podać filtry dla konwersacji w polu WHERE klauzula.

Następnie użyjemy tego zestawu wyników jako tabeli pochodnej i weźmiemy pod uwagę tylko te wiersze, w których wartość Numer wiersza wynosi 1 (ponieważ będzie należeć do ostatniego send_datetime ).

Schemat (MySQL v8.0)

Wyświetl na DB Fiddle

Zapytanie nr 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;

Wynik

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstawianie zmiennych MySQL do map Google za pomocą PHP

  2. Wybierz elementy z różnych źródeł i uporządkuj według daty

  3. Projekt bazy reguł cenowych dla systemu rezerwacji hotelowych

  4. Przechowywanie procentu w Rails + MySQL

  5. Jak przekonwertować tablicę MySQL JSON na ciąg oddzielony przecinkami?