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

Deltag i en enkelt række fra en tabel i MySQL

Dette er det største-n-per-gruppe-problem, der ofte dukker op på Stack Overflow.

Her er mit sædvanlige svar:

select
  p.name        player,
  s.date        first_score,
  s.points      points

from  players p

join  scores  s
  on  s.player_id = p.id

left outer join scores  s2
  on  s2.player_id = p.id
      and s2.date < s.date

where
  s2.player_id is null

;

Med andre ord, givet score s, prøv at finde en score s2 for den samme spiller, men med en tidligere dato. Hvis der ikke findes nogen tidligere score, så er s den tidligste.

Vedrørende din kommentar om slips:Du skal have en politik for, hvilken du skal bruge i tilfælde af uafgjort. En mulighed er, hvis du bruger auto-inkrementering primære nøgler, den med den mindste værdi er den tidligere. Se den ekstra term i den ydre sammenføjning nedenfor:

select
  p.name        player,
  s.date        first_score,
  s.points      points

from  players p

join  scores  s
  on  s.player_id = p.id

left outer join scores  s2
  on  s2.player_id = p.id
      and (s2.date < s.date or s2.date = s.date and s2.id < s.id)

where
  s2.player_id is null

;

Grundlæggende skal du tilføje tiebreaker-vilkår, indtil du kommer ned til en kolonne, der garanteret er unik, i det mindste for den givne spiller. Tabellens primære nøgle er ofte den bedste løsning, men jeg har set tilfælde, hvor en anden kolonne var egnet.

Med hensyn til de kommentarer, jeg delte med @OMG Ponies, så husk, at denne type forespørgsel har stor gavn af det rigtige indeks.



  1. Tilfældig række i MySQL

  2. MySql:gør denne forespørgsel hurtigere... er der en måde?

  3. Gem IPV6 og IPV4 i MySql og læs det også

  4. Når du bruger SELECT, kan du ændre værdien af ​​et returneret felt baseret på andre felter?