sql >> Database teknologi >  >> RDS >> Mysql

MySQL LEFT JOIN ved at bruge MAX &GROUP BY på det sammenføjede bord?

Det "seneste pr. gruppe"-problem er ekstremt almindelig i SQL. Der er utallige eksempler på løsninger på netop dette problem alene på denne side.

Hvis dine tidsstempler er unikke pr. medlemsaktivitet:

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)

alternativt, hvis dit aktivitets-id stiger monotont med tiden:

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

Du behøver ikke at gruppere. Men forespørgslen vil drage fordel af et indeks over activities over (member_id, timestamp) eller (member_id, id) hhv.

REDIGER

For at vise medlemmer, der ikke har logget en aktivitet, skal du bruge et venstretilmelding som dette.

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)

Bemærk, at der ikke er nogen WHERE klausul. Semantisk anvendes WHERE efter sammenføjningerne er udført. Så en WHERE-klausul ville fjerne de rækker, som LEFT JOIN tilføjede, hvilket i realiteten giver det samme resultat som den originale INNER JOIN.

Men hvis du anvender det ekstra prædikat til højre i forbindelsestilstanden, vil LEFT JOIN fungere som forventet.



  1. Hvordan kan jeg lave en FULD OUTER JOIN i MySQL?

  2. Cloud Vendor Deep-Dive:PostgreSQL på Google Cloud Platform (GCP)

  3. Indsæt store mængder data effektivt med SQL

  4. Hvordan får man ASCII-værdi i Oracle?