sql >> Base de Datos >  >> RDS >> Mysql

Unirse a una sola fila de una tabla en MySQL

Este es el mayor problema de n por grupo que surge con frecuencia en Stack Overflow.

Esta es mi respuesta habitual:

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

;

En otras palabras, dado el puntaje s, intente encontrar un puntaje s2 para el mismo jugador, pero con una fecha anterior. Si no se encuentra una puntuación anterior, entonces s es la más antigua.

Re tu comentario sobre los empates:Tienes que tener una política para saber cuál usar en caso de empate. Una posibilidad es que si utiliza claves primarias de incremento automático, la que tenga el menor valor será la anterior. Consulte el término adicional en la combinación externa a continuación:

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

;

Básicamente, debe agregar términos de desempate hasta que llegue a una columna que garantice que es única, al menos para el jugador en cuestión. La clave principal de la tabla suele ser la mejor solución, pero he visto casos en los que otra columna era adecuada.

Con respecto a los comentarios que compartí con @OMG Ponies, recuerda que este tipo de consulta se beneficia enormemente del índice correcto.