Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sous-requête MySQL - Rechercher uniquement le premier enregistrement dans une LEFT JOIN

C'est le greatest-n-per-group problème, qui est fréquemment demandé sur Stack Overflow.

Voici comment je le résoudrais dans votre scénario :

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;

Autrement dit, nous voulons mh être la ligne la plus récente dans tbl_member_login_history pour l'identifiant de membre donné. Nous recherchons donc une autre ligne mh2 c'est encore plus récent. Si aucun n'est plus récent que le mh ligne est trouvée, alors mh2.* sera NULL, donc mh doit être le plus récent.

Je suppose que cette table a une colonne de clé primaire qui contient des valeurs croissantes. Pour cet exemple, je suppose que le nom de la colonne est pk .

Utiliser LEFT OUTER JOIN pour les deux les références à la table d'historique des connexions signifient que le m ligne sera signalée même s'il n'y a pas de ligne correspondante.