Dette er den greatest-n-per-group
problem, som ofte stilles på Stack Overflow.
Sådan vil jeg løse det i dit scenarie:
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;
Det vil sige, vi vil have mh
at være den seneste række i tbl_member_login_history for det givne medlems-id. Så vi søger efter en anden række mh2
det er endnu nyere. Hvis ingen er nyere end mh
række er fundet, derefter mh2.*
vil være NULL, så mh
skal være den seneste.
Jeg antager, at denne tabel har en primær nøglekolonne, der indeholder stigende værdier. For dette eksempel antager jeg, at kolonnenavnet er pk
.
Bruger LEFT OUTER JOIN til begge referencer til login-historiktabellen betyder, at m
række vil blive rapporteret, selvom der ikke er nogen matchende række.