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

MySQL LEFT JOIN pomocí MAX &GROUP BY na spojeném stole?

Problém „nejnovější na skupinu“ je extrémně běžné v SQL. Jen na tomto webu je nespočet příkladů řešení právě tohoto problému.

Pokud jsou vaše časová razítka jedinečná pro aktivitu člena:

SELECT
  m.id,
  m.name,
  a.code activity_code,
  a.timestamp activity_timestamp,
  a.description activity_description
FROM
  members m
  INNER JOIN activities a ON a.member_id = m.id
WHERE
  a.timestamp = (SELECT MAX(timestamp) FROM activities WHERE member_id = m.id)

případně, pokud se vaše ID aktivity monotónně zvyšuje s časem:

  ...
WHERE
  a.id = (SELECT MAX(id) FROM activities WHERE member_id = m.id)

Nemusíte se seskupovat. Dotaz však bude těžit z indexu activities přes (member_id, timestamp) nebo (member_id, id) , respektive.

UPRAVIT

Chcete-li zobrazit všechny členy, kteří nezaprotokolovali aktivitu, použijte toto levé připojení.

SELECT
  m.id,
  m.name,
  a.code activity_code,
  a.timestamp activity_timestamp,
  a.description activity_description
FROM
  members m
  LEFT JOIN activities a ON 
    a.member_id = m.id
    AND a.timestamp = (SELECT MAX(timestamp) FROM activities WHERE member_id = m.id)

Všimněte si, že neexistuje žádné WHERE doložka. Sémanticky se WHERE použije po spojení jsou hotová. Klauzule WHERE by tedy odstranila řádky, které přidal LEFT JOIN, což by ve skutečnosti poskytlo stejný výsledek jako původní INNER JOIN.

Pokud ale v podmínce spojení použijete další predikát vpravo, bude LEFT JOIN fungovat podle očekávání.



  1. Heslo není ověřeno pomocí funkce password_verify

  2. Základy správy datových souborů na SQL Serveru

  3. Chyba:Metoda nebo operace není implementována. při lešení databáze MYSQL

  4. Java SQL ERROR:Relation Table_Name neexistuje