sql >> Databasteknik >  >> RDS >> Mysql

Gå med i en rad från en tabell i MySQL

Detta är det största problemet per grupp som dyker upp ofta på Stack Overflow.

Här är mitt vanliga 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 andra ord, givet poäng s, försök att hitta en poäng s2 för samma spelare, men med ett tidigare datum. Om ingen tidigare poäng hittas, är s den tidigaste.

Angående din kommentar om slipsar:Du måste ha en policy för vilken du ska använda vid oavgjort. En möjlighet är om du använder auto-inkrementerande primärnycklar, den med det lägsta värdet är den tidigare. Se tilläggstermen i den yttre sammanfogningen nedan:

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

;

I grund och botten måste du lägga till tiebreaker-termer tills du kommer ner till en kolumn som garanterat är unik, åtminstone för den givna spelaren. Den primära nyckeln i tabellen är ofta den bästa lösningen, men jag har sett fall där en annan kolumn var lämplig.

När det gäller kommentarerna jag delade med @OMG Ponies, kom ihåg att den här typen av frågor har stor nytta av rätt index.



  1. Vad är ett gratis verktyg för att jämföra två SQL Server-databaser?

  2. php mysql-funktion med valfri parameter

  3. sql facklig ordning

  4. Databasanvändarhantering:Hantera roller för MariaDB