Questo è il greatest-n-per-group
problema, che viene chiesto frequentemente in Stack Overflow.
Ecco come lo risolverei nel tuo scenario:
SELECT m.memberid, m.membername, m.gender, mp.phone, mh.loggedtime, mh.ipaddy
FROM tbl_members m
INNER JOIN tbl_members_phones mp ON m.defaultphoneid = mp.phoneid
INNER JOIN tbl_members_addresses ma ON m.defaultaddressid = ma.addressid
LEFT OUTER JOIN tbl_members_login_history mh ON m.memberid = mh.memberid
LEFT OUTER JOIN tbl_members_login_history mh2 ON m.memberid = mh2.memberid
AND mh.pk < mh2.pk
WHERE mh2.pk IS NULL;
Cioè, vogliamo mh
essere la riga più recente in tbl_member_login_history per l'ID membro specificato. Quindi cerchiamo un'altra riga mh2
che è ancora più recente. Se non è più recente di mh
viene trovata la riga, quindi mh2.*
sarà NULL, quindi mh
deve essere il più recente.
Suppongo che questa tabella abbia una colonna di chiave primaria che contiene valori crescenti. Per questo esempio, presumo che il nome della colonna sia pk
.
Usando LEFT OUTER JOIN per entrambi i riferimenti alla tabella della cronologia degli accessi indicano che il m
la riga verrà segnalata anche se non esiste una riga corrispondente.