Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Unterabfrage - Finde nur den ersten Datensatz in einem LEFT JOIN

Dies ist die greatest-n-per-group Problem, das häufig bei Stack Overflow gestellt wird.

So würde ich es in Ihrem Szenario lösen:

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;

Das heißt, wir wollen mh um die neueste Zeile in tbl_member_login_history für die angegebene Mitglieds-ID zu sein. Also suchen wir nach einer anderen Zeile mh2 das ist noch neuer. Wenn keiner neuer ist als der mh Zeile gefunden wird, dann mh2.* wird NULL sein, also mh muss die neueste sein.

Ich gehe davon aus, dass diese Tabelle eine Primärschlüsselspalte hat, die steigende Werte enthält. Für dieses Beispiel gehe ich davon aus, dass der Spaltenname pk ist .

Verwendung von LEFT OUTER JOIN für beide Verweise auf die Anmeldeverlaufstabelle bedeuten, dass der m Zeile wird gemeldet, auch wenn es keine übereinstimmende Zeile gibt.