sql >> Databasteknik >  >> RDS >> Mysql

MySQL subquery - Hitta endast första posten i en LEFT JOIN

Detta är den greatest-n-per-group problem, som ofta ställs på Stack Overflow.

Så här skulle jag lösa det i ditt 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;

Det vill säga, vi vill ha mh att vara den senaste raden i tbl_member_login_history för det givna medlems-id. Så vi söker efter en annan rad mh2 det är ännu nyare. Om ingen nyare än mh rad hittas, sedan mh2.* kommer att vara NULL, så mh måste vara den senaste.

Jag antar att den här tabellen har en primärnyckelkolumn som innehåller ökande värden. För det här exemplet antar jag att kolumnnamnet är pk .

Använder LEFT OUTER JOIN för båda referenser till inloggningshistoriktabellen betyder att m rad kommer att rapporteras även om det inte finns någon matchande rad.



  1. mysql2 pärla kompilerad för fel mysql-klientbibliotek

  2. Oracle:hur UPSERT (uppdatera eller infoga i en tabell?)

  3. Python/MySQL-frågefel:`Okänd kolumn`

  4. Hur infogar man en fil i Oracle Database?