Masalah "per grup terbaru" sangat umum di SQL. Ada banyak contoh solusi untuk masalah ini di situs ini saja.
Jika stempel waktu Anda unik untuk setiap aktivitas anggota:
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)
sebagai alternatif, jika ID aktivitas Anda meningkat secara monoton seiring waktu:
...
WHERE
a.id = (SELECT MAX(id) FROM activities WHERE member_id = m.id)
Anda tidak perlu mengelompokkan. Tetapi kueri akan mendapat manfaat dari indeks pada activities
lebih dari (member_id, timestamp)
atau (member_id, id)
, masing-masing.
EDIT
Untuk menampilkan anggota yang belum mencatat aktivitas, gunakan gabung kiri seperti ini.
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)
Perhatikan bahwa tidak ada WHERE
ayat. Secara semantik, WHERE diterapkan setelah bergabung dilakukan. Jadi, klausa WHERE akan menghapus baris yang ditambahkan LEFT JOIN, yang secara efektif memberikan hasil yang sama dengan INNER JOIN asli.
Tetapi jika Anda menerapkan predikat tambahan tepat dalam kondisi bergabung, LEFT JOIN akan berfungsi seperti yang diharapkan.