sql >> Databáze >  >> RDS >> PostgreSQL

Jak získat nejnovější zprávu v každé konverzaci určitého uživatele v SQL?

Za předpokladu uživatelů s ID 1 a 3 , stejně jako vy na housle, nás zajímá zpráva s nejnovějším created_at a (sender_id, receiver_id) je (1,3) nebo (3,1) .

Pro zkrácení syntaxe můžete použít ad-hoc typy řádků:

SELECT * 
FROM   messages 
WHERE  (sender_id, receiver_id) IN ((1,3), (3,1))
ORDER  BY created_at DESC
LIMIT  1;

Nebo explicitně (a o něco rychleji, také snadněji použitelný s indexy):

SELECT * 
FROM   messages 
WHERE (sender_id = 1 AND receiver_id = 3 OR
       sender_id = 3 AND receiver_id = 1)
ORDER  BY created_at DESC
LIMIT  1;

Pro všechny konverzace uživatele

Přidáno řešení podle požadavku v komentáři.

SELECT DISTINCT ON (user_id) *
FROM (
   SELECT 'out' AS type, id, receiver_id AS user_id, body, created_at
   FROM   messages 
   WHERE  sender_id = 1

   UNION  ALL
   SELECT 'in' AS type, id, sender_id AS user_id, body, created_at
   FROM   messages 
   WHERE  receiver_id = 1
   ) sub
ORDER  BY user_id, created_at DESC;

Zde je přístup složen cizího odesílatele/příjemce do jednoho sloupce, aby se zjednodušila extrakce posledního řádku.

Podrobné vysvětlení pro DISTINCT ON v této související odpovědi:
Vybrat první řádek v každé skupině GROUP BY?

-> Aktualizováno SQLfiddle .

Zvažte také vylepšený a zjednodušený testovací případ v houslích.



  1. Funkce MySQL LOG() – Vrátí přirozený logaritmus hodnoty

  2. Jak ON CONFLICT funguje v SQLite

  3. Dotaz k nalezení cizích klíčů

  4. Povolit 'xp_cmdshell' SQL Server