Det "seneste pr. gruppe"-problem er ekstremt almindelig i SQL. Der er utallige eksempler på løsninger på netop dette problem alene på denne side.
Hvis dine tidsstempler er unikke pr. medlemsaktivitet:
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)
alternativt, hvis dit aktivitets-id stiger monotont med tiden:
...
WHERE
a.id = (SELECT MAX(id) FROM activities WHERE member_id = m.id)
Du behøver ikke at gruppere. Men forespørgslen vil drage fordel af et indeks over activities
over (member_id, timestamp)
eller (member_id, id)
hhv.
REDIGER
For at vise medlemmer, der ikke har logget en aktivitet, skal du bruge et venstretilmelding som dette.
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)
Bemærk, at der ikke er nogen WHERE
klausul. Semantisk anvendes WHERE efter sammenføjningerne er udført. Så en WHERE-klausul ville fjerne de rækker, som LEFT JOIN tilføjede, hvilket i realiteten giver det samme resultat som den originale INNER JOIN.
Men hvis du anvender det ekstra prædikat til højre i forbindelsestilstanden, vil LEFT JOIN fungere som forventet.