sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan får man den seneste besked i hver samtale fra en bestemt bruger i SQL?

Forudsat brugerne med ID 1 og 3 , ligesom du gjorde i violinen, er vi interesserede i beskeden med den seneste created_at og (sender_id, receiver_id) er (1,3) eller (3,1) .

Du kan bruge ad-hoc rækketyper til at gøre syntaksen kort:

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

Eller eksplicit (og lidt hurtigere, også nemmere at bruge med indekser):

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;

For alle en brugers samtaler

Tilføjet løsning efter anmodning i kommentar.

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;

Fremgangsmåden her er at folde udenlandsk afsender/modtager i én kolonne for at forenkle udtrækningen af ​​den sidste række.

Detaljeret forklaring på DISTINCT ON i dette relaterede svar:
Vælg første række i hver GROUP BY-gruppe?

-> Opdateret SQLfiddle .

Overvej også den forbedrede og forenklede testcase i violinen.



  1. Sådan vælger du rækker med det seneste tidspunkt for hver dato inden for de sidste 30 dage fra nu

  2. Sådan administrerer du automatisk failover af MySQL-databasen til Moodle

  3. Fejl ved forsøg på at migrere postgresql db til mysql med workbench

  4. stenografi PDO-forespørgsel