Problém „nejnovější na skupinu“ je extrémně běžné v SQL. Jen na tomto webu je nespočet příkladů řešení právě tohoto problému.
Pokud jsou vaše časová razítka jedinečná pro aktivitu člena:
SELECT
m.id,
m.name,
a.code activity_code,
a.timestamp activity_timestamp,
a.description activity_description
FROM
members m
INNER JOIN activities a ON a.member_id = m.id
WHERE
a.timestamp = (SELECT MAX(timestamp) FROM activities WHERE member_id = m.id)
případně, pokud se vaše ID aktivity monotónně zvyšuje s časem:
...
WHERE
a.id = (SELECT MAX(id) FROM activities WHERE member_id = m.id)
Nemusíte se seskupovat. Dotaz však bude těžit z indexu activities
přes (member_id, timestamp)
nebo (member_id, id)
, respektive.
UPRAVIT
Chcete-li zobrazit všechny členy, kteří nezaprotokolovali aktivitu, použijte toto levé připojení.
SELECT
m.id,
m.name,
a.code activity_code,
a.timestamp activity_timestamp,
a.description activity_description
FROM
members m
LEFT JOIN activities a ON
a.member_id = m.id
AND a.timestamp = (SELECT MAX(timestamp) FROM activities WHERE member_id = m.id)
Všimněte si, že neexistuje žádné WHERE
doložka. Sémanticky se WHERE použije po spojení jsou hotová. Klauzule WHERE by tedy odstranila řádky, které přidal LEFT JOIN, což by ve skutečnosti poskytlo stejný výsledek jako původní INNER JOIN.
Pokud ale v podmínce spojení použijete další predikát vpravo, bude LEFT JOIN fungovat podle očekávání.