Este es el greatest-n-per-group
problema, que se pregunta con frecuencia en Stack Overflow.
Así es como lo resolvería en su escenario:
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;
Es decir, queremos mh
para ser la fila más reciente en tbl_member_login_history para el ID de miembro dado. Entonces buscamos otra fila mh2
eso es aún más reciente. Si ninguno es más reciente que el mh
se encuentra la fila, entonces mh2.*
será NULL, entonces mh
debe ser el más reciente.
Supongo que esta tabla tiene una columna de clave principal que contiene valores crecientes. Para este ejemplo, asumo que el nombre de la columna es pk
.
Uso de LEFT OUTER JOIN para ambos referencias a la tabla del historial de inicio de sesión significa que el m
la fila se informará incluso si no hay una fila coincidente.