Dit is de greatest-n-per-group
probleem, dat vaak wordt gesteld op Stack Overflow.
Zo zou ik het in jouw scenario oplossen:
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;
Dat wil zeggen, we willen mh
om de meest recente rij in tbl_member_login_history te zijn voor het opgegeven lidmaatschap. Dus zoeken we naar een andere rij mh2
dat is nog recenter. Indien geen recenter dan de mh
rij is gevonden, dan mh2.*
zal NULL zijn, dus mh
moet de meest recente zijn.
Ik ga ervan uit dat deze tabel een primaire sleutelkolom heeft die oplopende waarden bevat. Voor dit voorbeeld neem ik aan dat de kolomnaam pk
is .
LEFT OUTER JOIN gebruiken voor beide verwijzingen naar de tabel met inloggeschiedenis betekent dat de m
rij wordt gerapporteerd, zelfs als er geen overeenkomende rij is.