sql >> Databasteknik >  >> RDS >> Mysql

SQL:gruppera efter från annan tabell och invertera resultatet

Mycket enkelt och snabbt i PostgreSQL med DISTINCT ON - inte standard SQL så inte tillgänglig i alla RDBMS.

Frågan nämner det inte, men utifrån kodexemplen letar den faktiskt efter raden med "senaste datum" för varje mottagare för en given författare .

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 flera SQL-standardalternativ här:
Välj första raden i varje GROUP BY-grupp?

En annan lösning med grundläggande, standard SQL. Fungerar med alla större RDBMS, inklusive MySQL (eftersom den taggen har lagts till):

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
   )

Endast raden med det senaste datumet passerar FINNS INTE anti-semi-join.



  1. Flera Hibernate-sekvensgeneratorer för en enhet med PostgreSQL

  2. Oracle RAC och sekvenser

  3. fil eller LOB-operation FILEOPEN misslyckades när en XML-fil laddades in i en tabell

  4. Rails konverterar inte tidszon (PostgreSQL)