Това е greatest-n-per-group
проблем, който се задава често при препълване на стека.
Ето как бих го решил във вашия сценарий:
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;
Тоест искаме mh
да бъде най-новият ред в tbl_member_login_history за дадения memberid. Така че търсим друг ред mh2
това е още по-скоро. Ако не е по-скоро от mh
е намерен ред, след което mh2.*
ще бъде NULL, така че mh
трябва да е най-новата.
Предполагам, че тази таблица има колона с първичен ключ, която съдържа нарастващи стойности. За този пример предполагам, че името на колоната е pk
.
Използване на LEFT OUTER JOIN за и двете препратките към таблицата с историята на влизане означават, че m
ред ще бъде докладван, дори ако няма съответстващ ред.