Mysql
 sql >> Database >  >> RDS >> Mysql

Sottoquery MySQL - Trova solo il primo record in un LEFT JOIN

Questo è il greatest-n-per-group problema, che viene chiesto frequentemente in Stack Overflow.

Ecco come lo risolverei nel tuo scenario:

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;

Cioè, vogliamo mh essere la riga più recente in tbl_member_login_history per l'ID membro specificato. Quindi cerchiamo un'altra riga mh2 che è ancora più recente. Se non è più recente di mh viene trovata la riga, quindi mh2.* sarà NULL, quindi mh deve essere il più recente.

Suppongo che questa tabella abbia una colonna di chiave primaria che contiene valori crescenti. Per questo esempio, presumo che il nome della colonna sia pk .

Usando LEFT OUTER JOIN per entrambi i riferimenti alla tabella della cronologia degli accessi indicano che il m la riga verrà segnalata anche se non esiste una riga corrispondente.