Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Subconsulta MySQL - Encontre apenas o primeiro registro em um LEFT JOIN


Este é o greatest-n-per-group problema, que é perguntado frequentemente no Stack Overflow.

Veja como eu resolveria isso no seu cenário:
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;

Ou seja, queremos mh para ser a linha mais recente em tbl_member_login_history para o ID de membro fornecido. Então procuramos por outra linha mh2 isso é ainda mais recente. Se nenhum for mais recente que o mh linha for encontrada, então mh2.* será NULL, então mh deve ser o mais recente.

Estou assumindo que esta tabela tem uma coluna de chave primária que contém valores crescentes. Para este exemplo, presumo que o nome da coluna seja pk .

Usando LEFT OUTER JOIN para ambos referências à tabela de histórico de login significa que o m linha será relatada mesmo se não houver nenhuma linha correspondente.