sql >> Database >  >> RDS >> Mysql

MySQL-subquery - Vind alleen het eerste record in een LEFT JOIN

Dit is de greatest-n-per-group probleem, dat vaak wordt gesteld op Stack Overflow.

Zo zou ik het in jouw scenario oplossen:

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;

Dat wil zeggen, we willen mh om de meest recente rij in tbl_member_login_history te zijn voor het opgegeven lidmaatschap. Dus zoeken we naar een andere rij mh2 dat is nog recenter. Indien geen recenter dan de mh rij is gevonden, dan mh2.* zal NULL zijn, dus mh moet de meest recente zijn.

Ik ga ervan uit dat deze tabel een primaire sleutelkolom heeft die oplopende waarden bevat. Voor dit voorbeeld neem ik aan dat de kolomnaam pk is .

LEFT OUTER JOIN gebruiken voor beide verwijzingen naar de tabel met inloggeschiedenis betekent dat de m rij wordt gerapporteerd, zelfs als er geen overeenkomende rij is.



  1. Moeite om te beslissen over het identificeren of niet-identificerende relatie

  2. DateTime groeperen op datum en uur

  3. Hoe lege tabellen in Oracle te exporteren

  4. T-SQL dynamische spil