sql >> Databáze >  >> RDS >> Mysql

SQL:seskupit podle z jiné tabulky a invertovat výsledek

Velmi jednoduché a rychlé v PostgreSQL s DISTINCT ON - není standardní SQL, takže není k dispozici v každém RDBMS.

Otázka to nezmiňuje, ale na základě příkladů kódu ve skutečnosti hledá řádek s "posledním datem" pro každého příjemce pro daného 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

Podrobnosti a několik standardních alternativ SQL zde:
Vybrat první řádek v každé skupině GROUP BY?

Další řešení se základním, standardním SQL. Funguje se všemi hlavními RDBMS, včetně MySQL (od té doby, co byla tato značka přidána):

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
   )

Hodnotu NOT EXISTS projde pouze řádek s nejnovějším datem anti-semi-join.



  1. Při dokončení kurzu aktualizujte externí databázi

  2. Proč tento spouštěč selže? Píše to neplatný identifikátor

  3. WHERE IN (pole ID)

  4. mySQL Největší počet podle skupiny