Búsqueda Inversa en mysql / php

Estoy haciendo un ranking de una competición determinada. Los participantes pueden tener varias puntuaciones distintas en la misma competición y luego estas puntuaciones se suman (explico esto para que sepan de que va un poco la cosa...).
Tengo estas tablas.
Competiciones - id_competicion, nombre
Participantes - id_participante, nombre
Pruebas - id_prueba, nombre
Puntuaciones - id_puntuacion, id_competicion, id_participante, id_prueba, puntuacion
Pues bien, quiero hacer un listado de los participantes que NO tienen puntuación en una competición determinada.
1

1 Respuesta

2.800 pts. Consultor TIC con experiencia de más de diez años en el...
Entiendo que en tu caso para los participantes que NO tienen puntuación no existen registros en la tabla de puntuaciones. Para hacer esta consulta necesitas utilizar una RIGHT o LEFT JOIN.
Por ejemplo en un LEFT JOIN del tipo:
select t1.campoid, t1.campo2, t2.campoid, t2.campoid1, t2.campo2
  from tabla1 t1 left join tabla2 t2 on  t1.campoid = t2.campoid1

Te devolvería todos los registros de la tabla1 haya o no registros en la tabla2 para su clave. En los casos en los que no hay registro te devuelve un nulo para los campos de la tabla 2. Esto es lo que te permitirá filtrar.
En tu consulta y considerando quedaría algo así:
    SELECT Participantes.id_participante, Participantes.nombre, Competiciones.nombre
      FROM Participantes
 LEFT JOIN Puntuaciones
       ON Participantes.id_participante = Puntuaciones.id_participante
INNER JOIN Competiciones
        ON Competiciones.id_competicion = Puntuaciones.id_competicion
     WHERE Puntuaciones.id_participante IS NULL
  GROUP BY Participantes.id_participante, Participantes.nombre, Competiciones.nombre

La INNER JOIN Competiciones es necesaria para mostrar datos por conpetición. Y la consulta te da todos los registros de Participantes para los que no hay valores en Puntuaciones (Puntuaciones. id_participante IS NULL)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas