sql >> Database teknologi >  >> RDS >> Mysql

SQL:grupper efter fra anden tabel og inverter resultatet

Meget enkel og hurtig i PostgreSQL med DISTINCT ON - ikke standard SQL, så ikke tilgængelig i alle RDBMS.

Spørgsmålet nævner det ikke, men ud fra kodeeksemplerne leder det faktisk efter rækken med "sidste dato" for hver modtager for en given author .

SELECT DISTINCT ON (r.recipient) m.* FROM message m JOIN recipient r ON r.m_id = m.id WHERE m.author = 1 ORDER BY r.recipient, m.date DESC, r.m_id -- to break ties

Detaljer samt flere SQL-standardalternativer her:
Vælg første række i hver GROUP BY-gruppe?

Endnu en løsning med grundlæggende, standard SQL. Virker med alle større RDBMS, inklusive MySQL (siden det tag er blevet tilføjet):

SELECT m.* 
FROM   message   m
JOIN   recipient r ON r.m_id = m.id
WHERE  m.author = 1
AND NOT EXISTS (
   SELECT 1
   FROM   message   m1
   JOIN   recipient r1 ON r1.m_id = m1.id
   WHERE  r1.recipient = r.recipient 
   AND    m1.author = 1
   AND    m1.date > m.date
   )
 

Kun rækken med den seneste dato passerer NOT EXISTS anti-semi-join.



  1. PostgreSQL:Find sætninger tættest på en given sætning

  2. Opret en pl/sql-funktion og find skudår

  3. Postgres:konverter enkelt række til flere rækker (unpivot)

  4. MySQL:Optimering GRUPPER VED flere nøgler