SQL - Ayuda con sentencia SQL

   
Vista:

Ayuda con sentencia SQL

Publicado por David (4 intervenciones) el 22/11/2010 17:51:27
Buenas, espero puedan ayudarme porque no doy conseguido la consulta necesaria para calcular una clasificacion.

Las criterios de ordenacion que debe seguir son:
1º - mayor valoracion
2º - partido ganado
3º - mayor puntuacion

Entonces se supone que en un partido se da una valoracion determinada y los jugadores llevan una puntuacion acumulada.

Los datos que se necesitan están en 4 tablas diferentes :

valoraciones (id, iPartido, idJugador, valoracion)
partidos (id, idParejaLocal, idParejaVisitante,resultadoLocal, resultadoVisitante)
parejas (id, idJugador1, idJugador2)
jugadores (id, nombre, puntosTotales)

Con estos datos necesito obtener un listado de valoraciones ordenadas por los criterios anteriores

Lo máximo a lo que llego es a obtener un listado ordenado por valoracion y puntuacion, pero sin tener en cuenta la victoria del partido...

SELECT jugadores.id as idJugador, jugadores.nombre as nombreJugador, jugadores.puntosTotales as puntosTotales, SUM(valoraciones.valoracion) AS sumaValoracion
FROM valoraciones LEFT JOIN jugadores ON valoraciones.idJugador = jugadores.id
WHERE valoraciones.idPartido = ?
GROUP by jugadores.id, jugadores.apodo, jugadores.puntosATP
ORDER BY 4 DESC, 3 DESC

Espero que me puedan ayudar... si necesitan más datos se los facilito. Muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con sentencia SQL

Publicado por Leonardo Josué (880 intervenciones) el 22/11/2010 19:16:34
Buenas Tardes David, estoy tratando de entender el problema, pero hay varios detalles que quisiera que me aclararas:

el segundo criterio de ordenación (2º - partido ganado) a qué se refiere? según yo sería al número de victorias que el jugador tiene pero no sé si estoy en lo correcto.

también serviría que colocaras las relaciones entre tus tablas, según yo serían así. Un jugador pertenece tiene una (y solo una) pareja. Una pareja puede jugar 0 o más partidos y un partido tiene una (y solo una) valoración para cada jugador.

También serviría que nos pusieras algunos datos de ejemplo y que nos comentaras qué manejador de BD estás utilizando, para poder replicar el escenario.

Saludos.
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con sentencia SQL

Publicado por David (4 intervenciones) el 22/11/2010 23:56:17
Hola Leo, muchas gracias por contestar.
Te explico:
Un partido lo jugarían 4 jugadores (2 parejas) y cada jugador tendría que valorar con 3,2 y 1 punto a los otros 3 participantes. Por lo tanto tendríamos 3 valoraciones para cada jugador (de ahí el group by). Lo que yo necesito es un listado de los 4 jugadores ordenado de mayor a menor, primero la suma de la valoracion, en caso de empate en la suma de la valoración, que sea primero el jugador que haya ganado el partido (2 jugadores ganan y 2 pierden) y si sigue habiendo empate que sea primero el que mas puntos totales tenga (el campo puntosTotales de la tabla jugadores)

Utilizo MySQL, si necesitas más datos, no dudes en pedírmelos.
Muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con sentencia SQL

Publicado por Leonardo Josué (880 intervenciones) el 23/11/2010 19:01:31
Serviría de mucho que pongas algunos datos de ejemplo, y que pusieras correctamente la estructura de tus tablas, por ejemplo en el primer post mencionas esto:

valoraciones (id, iPartido, idJugador, valoracion)
partidos (id, idParejaLocal, idParejaVisitante,resultadoLocal, resultadoVisitante)
parejas (id, idJugador1, idJugador2)
jugadores (id, nombre, puntosTotales)

sin embargo en la consulta que pones de ejemplo mencionas algunos campos que no se mencionaste en la definición de tus tablas (jugadores.apodo, jugadores.puntosATP) y otra pregunta, el listado siempre se va a realizar considerando sólo un partido???

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con sentencia SQL

Publicado por David (4 intervenciones) el 23/11/2010 23:35:59
Sí, perdona. Me equivoqué: jugadores.apodo es el campo "nombre" de la tabla jugadores y puntosATP es "puntosTotales" también de la tabla jugadores.

El listado siempre va a ser de un único partido.

Un ejemplo
Tenemos 4 jugadores con los siguientes puntos totales:
David 16
Fernando 22
Pedro 9
Víctor 17

Se juega un partido
David- Fernando vs. Pedro-Víctor y el resultado es 2-1
Y las valoraciones serían las siguientes

David : Fernando 3 puntos, Víctor 2 puntos y Pedro 1 punto
Fernando : Víctor 3 puntos, David 2 puntos y Pedro 1 punto
Pedro : Fernando 3 puntos, David 2 puntos y Víctor 1 punto
Víctor : Pedro 3 puntos, David 2 puntos y Fernando 1 punto

Por tanto las valoraciones serían:
David 6
Fernando 7
Pedro 5
Víctor 6

El listado que me gustaria obtener sería

Nombre - sum(valoracion) - partido ganado - puntos totales
Fernando - 7 - 1 - 22
David - 6 - 1 - 16
Víctor - 6 - 0 - 17
Pedro - 5 - 0 - 9

El orden en caso de empate de la suma de la valoración, sería primero el que ganó el partido y si persiste el empate el que más puntos totales tenga.

Muchas gracias Leo, si necesitas más datos no dudes en pedirlos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con sentencia SQL

Publicado por Leonardo Josué (880 intervenciones) el 24/11/2010 18:48:56
Primero y antes que nada quiero comentarte que el diseño de tus tablas resultó un problema, pues tienes dobles referencias entre tablas, es decir, un mismo registro se relaciona dos veces con otras tablas, es el caso de jugadores con parejas y parejas con partidos, pero en fin. Creo que tu consulta quedaría más o menos así:

select j.nombre,
(select sum(valoracion) from valoraciones where idPartido = 100 and idJugador = j.id) as valoracion,
ifnull((
select case when resultadoLocal > resultadoVisitante then 1 else 0 end from partidos where id = 100 and idParejaLocal = parejas.id
), 0) +
ifnull((
select case when resultadoLocal < resultadoVisitante then 1 else 0 end from partidos where id = 100 and idParejaVisitante = parejas.id
), 0) partidoGanado,
j.puntosTotales
from jugadores j
inner join parejas on parejas.idJugador1 = j.id or parejas.idJugador2 = j.id
order by valoracion desc, partidoGanado desc, puntosTotales desc;

Para el ejemplo siempre estoy considerando el partido con id 100, sería cuestión que revises si hay algún error. Tal vez la consulta se pueda optimizar más, pero de primera es lo único que se me ocurrió.

Dale un vistazo para ver si entiendes más o menos cuál fue la lógica que seguí y si tienes alguna duda u observacion lo comentas en el foro.

Saludos
Leo.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con sentencia SQL

Publicado por David (4 intervenciones) el 25/11/2010 00:37:21
Muchas gracias Leo, era justo lo que necesitaba! Sé que la estructura de la BD no es la óptima, pero gracias a tu consulta he solucionado el problema. De nuevo muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar