Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

consulta compleja

Estas en el tema de consulta compleja en el foro de Bases de Datos General en Foros del Web. Hola a todos; Llevo tiempo intentando solucionar una consulta que me trae de cabeza, no he visto nada en los foros ni en los tutoriales ...
  #1 (permalink)  
Antiguo 01/09/2009, 11:11
 
Fecha de Ingreso: septiembre-2009
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
consulta compleja

Hola a todos;
Llevo tiempo intentando solucionar una consulta que me trae de cabeza, no he visto nada en los foros ni en los tutoriales de mysql ni php. El problema es el siguiente:

Tengo una tabla en la que guardo los registros de unas puntuaciones que consiguen deportistas en diversas pruebas durante el año, el total de pruebas que se pueden disputar son 32 pero solo se contabilizan las 25 mejores puntuaciones conseguidas.
He conseguido sacar por pantalla una tabla con las puntuaciones y los deportistas, y sumar las 32, pero no se como hacer para sumar solo las 25 mejores de cada uno.
Mi idea era crear unas tablas temporales con los nombres de los deportistas (sacandolos de un consulta) y en ellas meter los 25 primeros registros ordenados de mallor a menor, luego hacer una suma de los registros y mostrarlos, pero no lo he conseguido.
Código PHP:
$nobresciclistas=mysql_query("select ciclista  from $tabla where ano = 2009 group by ciclista"$conexion);
while (
$row1=mysql_fetch_array($nobresciclistas))
{
mysql_query("CREATE TEMPORARY TABLE $row1[0] AS (SELECT $clas3 AS total FROM $tabla WHERE ciclista=$row1[0] GROUP BY ruta ORDER BY total DESC LIMIT 25)"$conexion);
      
$suma=mysql_query("SELECT SUM(total) FROM $row1[0]"$conexion);
         while (
$row2=mysql_fetch_array($suma))
            {
            echo 
'$row1[0],  $row2[0]';
              }

No se si esto es muy acertado, el caso es que no funciona, supongo que esto tendra alguna solucion. Os agradezco la atencion y espero vuestras propuestas. Salu2
  #2 (permalink)  
Antiguo 01/09/2009, 12:21
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: consulta compleja

No creo que sea necesaria una tabla adicional.

Recuerda que no puedes poner codigo php ni html en este foro. aca solo se tratan preguntas relacionadas con bases de datos.

Código sql:
Ver original
  1. SELECT SUM(t1.suma) suma_total, FROM
  2. (SELECT puntaje suma FROM tabla ORDER BY puntaje DESC LIMIT 25)t1;

Esto solo te suma 25 posiciones rescatadas de la clausula limit.

te sirve?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 01/09/2009, 14:17
 
Fecha de Ingreso: septiembre-2009
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: consulta compleja

Gracias por la respuesta, pero sé cómo hacerlo para un solo deportista, el problema está en conseguirlo para tantos deportistas como hayan puntuado en el año y hacerlo de una sola consulta.
los campos de mi tabla son: deportista, prueba, puntos, año.
la intención es sumar las "n" mejores puntuaciones en el año de cada uno.
Mysql no permite usar la clausula LIMIT dentro de una subconsulta, sino sería muy fácil.
Salu2.
  #4 (permalink)  
Antiguo 01/09/2009, 14:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: consulta compleja

Yo creo que la solución la encontrarás mejor con programación. Buscas ordenando por deportista y puntuación (esto es MySQL) las puntuaciones del año. Luego, recogidos los datos en el programa, iteras controlando que sólo pasen los 25 primeros o los que haya si son menos de 25 de cada deportista y cargando la suma de los valores de esos 25 o los que sean si son menos, más el número del deportista en un array; ordenas el array por ese sumatorio y ya los tienes. Pide ayuda en el foro PHP para realizar el proceso.
  #5 (permalink)  
Antiguo 01/09/2009, 16:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: consulta compleja

Cita:
Iniciado por pepeglobez Ver Mensaje
Mysql no permite usar la clausula LIMIT dentro de una subconsulta, sino sería muy fácil.
Salu2.
En realidad, acabo de probar, y MySQL, al menos en su versión 5.1 no hace ningun problema al ejecutar un LIMIT dentro de una subconsulta.
¿Qué versión estás usando?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 02/09/2009, 00:06
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: consulta compleja

perdón, por error repetí el mensaje: ver el siguiente.
  #7 (permalink)  
Antiguo 02/09/2009, 00:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: consulta compleja

Creo que el problema no es que se acepte el límit, sino que ese limit no puede referirse a los 25 de cada primeros de cada deportista, es decir, lo que buscamos son los 25 mejores valores de cada deportista y de todos los deportistas, para luego hacer la suma de cada grupo y ordenarlos. Con un group by por deportista sólo tendrías uno, si lo haces ordenando por deportista no puedes separar los 25 más altos de cada uno, pienso. Creo que ese es el verdadero problema.
Sé que hay soluciones con MySqL. Si asignamos un número a cada puntuación de cada deportista ordenada en descendente (alguna vez he visto hacer una consulta parecida a gnzsoloyo) y luego buscamos las que tienen un número menor de 25 en ese campo, agrupamos por deportista y sumamos los valores y ordenamos por esa suma, tendremos lo que queremos, sea con una consulta o exportando a una tabla, o tal vez con un store procedure, pero en cualquier caso yo creo que tal vez sería más eficiente hacerlo con programación.
  #8 (permalink)  
Antiguo 15/09/2009, 14:14
 
Fecha de Ingreso: septiembre-2009
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: consulta compleja

Hola a todos;
al final resolví el problema con un poco de programación, como decía algún post.
Se trata de hacer un array con el resultado de una consulta que rescata todos los resultados de cada deportista $miarray=array($row[1],$row[2],$row[3],...), una vez tenemos el array lo ordenamos en descendente con rsort($miarray) y el resultado lo reduciremos a 25 resultados con array_slice($miarray, 0, 25) y después lo sumamos así array_sum(array_slice($miarray, 0, 25)) consiguiendo la suma de los 25 mejores resultados de cada deportista.
Salu2 y gracias por vuestro interés.
  #9 (permalink)  
Antiguo 16/09/2009, 13:15
 
Fecha de Ingreso: julio-2009
Mensajes: 44
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: consulta compleja

por que no utilizas un select top 25.....................................
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:54.