sql >> Databáze >  >> RDS >> Mysql

Poddotaz MySQL - Najděte pouze první záznam v LEFT JOIN

Toto je greatest-n-per-group problém, který je často kladen na Stack Overflow.

Zde je návod, jak bych to vyřešil ve vašem scénáři:

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;

To znamená, že chceme mh být nejnovějším řádkem v tbl_member_login_history pro dané členské ID. Takže hledáme další řádek mh2 to je ještě novější. Pokud není novější než mh řádek je nalezen, pak mh2.* bude NULL, takže mh musí být nejnovější.

Předpokládám, že tato tabulka má sloupec primárního klíče, který obsahuje rostoucí hodnoty. V tomto příkladu předpokládám, že název sloupce je pk .

Použití LEFT OUTER JOIN pro obě odkazy na tabulku historie přihlášení znamenají, že m řádek bude hlášen, i když neexistuje žádný odpovídající řádek.



  1. O SQLite

  2. Úprava řádků tabulky / záznamů v SQL Server Management Studio ( SSMS) - SQL Server výukový program / TSQL výukový program, část 18

  3. MySQL a CASE WHEN s rozsahem hodnot

  4. Jak vygenerovat jedinečnou náhodnou hodnotu pro každého uživatele v laravel a přidat ji do databáze