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

como mostrar los resultados ordenados al utilizar sum que depende de otra tabla?

Estas en el tema de como mostrar los resultados ordenados al utilizar sum que depende de otra tabla? en el foro de Mysql en Foros del Web. Hola intentare explicarme mejor que en el titulo jejee. Vereis tengo dos tablas una con id y nombre, y la otra que guarda todos los ...
  #1 (permalink)  
Antiguo 06/01/2009, 09:15
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
como mostrar los resultados ordenados al utilizar sum que depende de otra tabla?

Hola intentare explicarme mejor que en el titulo jejee.

Vereis tengo dos tablas una con id y nombre, y la otra que guarda todos los datos, todos numeros, lo que quiero es hacer la suma de un campo de la segunda tabla pero que muestre el nombre, donde tiene que consultarla en la primera

tabla1
id nombre
1 pepe
2 juan
3 paco

Tabla2
id id_nombre puntos
1 2 20
2 1 10
3 2 5
4 2 7
5 3 3

hago la consulta SELECT id_nombre, SUM(puntos) as suma FROM tabla2 where id_nombre='$id' order by suma

antes hago la consulta a la tabla1 para que me muestre los nombres, de hay es donde obtengo el id de la segunda consulta, perdonad es que aun no se muy bien como hacerla anidada, bueno el caso es que hace la suma de cada uno de los nombres, pero me muestra el resultado segun el roden de la tabla1 y no por el orden de la suma.

¿Que podria hacer? yo quiero que muestre el orden de la suma no de los nombres de la tabla1.

Saludos y gracias.
  #2 (permalink)  
Antiguo 06/01/2009, 11:10
 
Fecha de Ingreso: mayo-2006
Ubicación: Bogotá
Mensajes: 2.061
Antigüedad: 18 años
Puntos: 50
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

No se si le entendi bien lo que quiere hacer pero pruebe dco nesto y me cuenta

En vez de las dos consultas hace esta sola asi

Código:
SELECT tabla1.nombre, sum(tabla2.puntos)
FROM tabla1 INNER JOIN tabla2 ON tabla1.id = tabla2.id_nombre group by tabla2.id_nombre order by sum(tabla2.puntos) desc

es algo asi segun le entendi.
  #3 (permalink)  
Antiguo 06/01/2009, 12:32
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

Muchas gracias helacer es lo que queria, si lo entendiste bien jejeje, un par de preguntas mas, habria forma de mostrar los nombres que no tienen puntos? proque ahora solo muestra los que tienen puntos en la tabla 2, osea que muestre todos los nombres aunque muestre 0 o nada, a los que no tienen puntos en la tabla 2, imagino que eso ya es mas complicado si es que se peude hacer, si no no pasa nada.

Lo que me olvide en el primer mensaje es que la tabla dos tambien contiene un campo año que es 1 2 3, etc y lo que pretendia es que muestre todo ordenado como ahora pero que aparezcan por ejemplo los 10 nombres que hay ordenados por tuntos como ahora, pero del año 1 y asi con el año 2, etc

Perdona no quiero complicarlo mas, ya has echo mucho descifrando lo que queria jejejeje. Muchas gracias.

Bueno pensandolo bien lo del listado de nombres que no tengan puntos podria arreglarlo para ingresarlos en la tabla 2 sin puntos, o con 0 asi aparecerian no? es para no complicarlo mucho.
  #4 (permalink)  
Antiguo 06/01/2009, 12:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

Para lo primero, es decir, los que no tienen puntos, no rellenes datos innecesarios en las tablas.
Usa LEFT JOIN
SELECT tabla1.nombre, IFNULL(sum(tabla2.puntos),'0') puntos
FROM tabla1 LEFT JOIN tabla2 ON tabla1.id = tabla2.id_nombre group by tabla2.id_nombre order by sum(tabla2.puntos) desc
No lo he probado

Respecto a lo otro, aclara un poco más, pakillo. ¿Quieres sacar los 10 más valorados de cada año, ordenados por su valor de manera descendente, pero quieres sacar todos los años? ¿Es eso?

Última edición por jurena; 06/01/2009 a las 12:57
  #5 (permalink)  
Antiguo 06/01/2009, 12:50
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

gracias por contestar, voy a probar lo que me dices del left join, eso tendria que agregarlo a la consulta que me dio helacer no? o es una consulta aparte?
Sobre lo segundo si es eso loq ue quiero hacer, como son pocos años 4, pues me gustaria mostrar los 10 más valorados como ahora pero tambien por año, vamos ahora me muestra lo del ultimo año, pero es porque le agrege un and a mano apra probar si solo mostraba ese año, a mano me refiero colocando el numero directamente, lo deje asi

SELECT tabla1.nombre, sum(tabla2.puntos)
FROM tabla1 INNER JOIN tabla2 ON tabla1.id = tabla2.id_nombre and tabla2.id_año = 1 group by tabla2.id_nombre order by sum(tabla2.puntos) desc

por eso solo me muestra la tabla con los de ese año, pensaba si se podria hacer que muestre el ultimo año como ahora y luego el anterior y asi.
  #6 (permalink)  
Antiguo 07/01/2009, 12:53
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

Bueño ya arregle lo del año, solo me queda lo de los datos vacios, y creo que la consulta no me funciona porque en la tabla 2 no se guardan todos os nombres solo los nombres que tienen puntos, si en la tabla1 hay 10 nombres y en la tabla2 hay 20 pero son solo 8 nombres de la tabla1 que algunos se repiten, vamos que solo se guardan en la tabla2 los que puntuan, por eso no muestra esos nombres porque solo comprueba los que aparecen en la tabla2.

Para que se entienda mejor loq ue quiero es que aparezcan son todos los nombres aunque no tengan puntos, los que no tienen puntos que aparezcan al final de la tabla con 0 peo esos estan en la tabla 1. Uff espero que se entieda :)
  #7 (permalink)  
Antiguo 07/01/2009, 13:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

En lugar de lo que has puesto, escribe esto y pruebalo.


SELECT tabla1.nombre, IFNULL(sum(tabla2.puntos),0)
FROM tabla1 LEFT JOIN tabla2 WHERE tabla2.id_año = 1 ON tabla1.id = tabla2.id_nombre group by tabla2.id_nombre order by sum(tabla2.puntos) desc


Respecto a lo segundo, quizás te conviniera hacerlo mediante programación. Sacar los 10 primeros en puntuación en orden según el año puede hacerse fácilmente o iterando dentro de una consulta de años, o con otra consulta iterada usando union all. La primera requiere tantas consultas como año (en la sintaxis son dos consultas); la segunda mediante una consulta, pero los resultados se obtendrían en una sola lista. Seguro que hay más opciones.
  #8 (permalink)  
Antiguo 07/01/2009, 17:06
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

Gracias jurena pero no funciona, lo de la puntuación según el año ya lo arreglé antes, el problema es para mostrar los registros que no tienen puntuación, creo que me explique mal, lo digo proque la consulta la he colocado como me has dicho pero no funciona y creo que es porque mostraria los resultados que no tienen puntuación pero de la tabla2 no? ese es el problema, veras tengo la tabla 1 con los nombres y la tabla2 con puntuaciones.

En la tabla 2 solo se guarda la puntuación de algunos nombres, solo los que puntúan, por ejemplo, en la tabla1 hay 10 nombres y solo 7 han puntuado, esa puntuación se guarda en la tabla2 con el id_nombre se quedarían 3 sin puntuar, al hacer la consulta solo muestra los 7 nombres que han puntuado, y los otros 3 no aparecen ni con un 0, y por lo que veo, aunque no estoy muy puesto en mysql, es porque la consulta se hace sobre la tabla2 no? esa es la que tiene la puntuación de esos 7 nombres.

Lo que quisiera es que muestre todo el listado de nombres y el que no ha puntuado lo muestre con 0, pero claro eso no se hacerlo sin perder la forma de ordenador por el sum.

Espero que se entienda mejor, no se si me estoy complicando mucho :), gracias por tu paciencia
  #9 (permalink)  
Antiguo 08/01/2009, 12:45
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

hola jurena, he utilizado la consulta pero solo me muestra el primer registro a 0, he borrado todos los regstros de la tabla2 se supone que moistraria todo el listado de nombres de la tabla1 pero con 0 pero solo me muestra el primer registro de la tabla1 con 0 los demas no los muestra :(
  #10 (permalink)  
Antiguo 08/01/2009, 13:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

Si solo consultas un año, puedes hacer esto:
SELECT t1.nombre, IFNULL( t3.puntos, 0 ) PUNTOS
FROM tabla1 t1
LEFT JOIN (

SELECT tabla1.id, sum( tabla2.puntos ) puntos
FROM tabla1
INNER JOIN tabla2 ON tabla1.id = tabla2.id_nombre
WHERE tabla2.id_ano =1
GROUP BY tabla2.id_nombre, tabla2.id_ano
)t3 ON t1.id = t3.id

El problema no resuelto es cuando quieres sacar todos los años, puesto que sería año y nombre. Seguiremos intentando.

Última edición por jurena; 08/01/2009 a las 15:37
  #11 (permalink)  
Antiguo 08/01/2009, 17:30
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

hola jurena, estoy un pcoo confuso, el t3 es otra tabla? solo hay la 1 y la 2
  #12 (permalink)  
Antiguo 09/01/2009, 00:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

Cita:
Iniciado por pakillo Ver Mensaje
hola jurena, estoy un pcoo confuso, el t3 es otra tabla? solo hay la 1 y la 2
El t3 es el alias no de una tabla, sino de todo ese SELECT segundo que va entre paréntesis y que utiliza el cruce INNER JOIN, y que se une mediante LEFT JOIN a los datos de la tabla1, concretamente a los id_nombre.

Última edición por jurena; 09/01/2009 a las 01:56
  #13 (permalink)  
Antiguo 09/01/2009, 04:25
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

entiendo, pero ahora no muestra los puntos, sale el listado de nombres pero no los puntos, al principio no mostraba nada, salia la tabla en blanco, pero fue culpa mia que habia puesto una coma de mas jejeje pero ya lo he mirado 3 veces esta tal cual como lo has escrito, ahora me muestra el listado de nombres pero no los puntos, lo de los años yo lo arregle haciendo otra consulta que me muestra todos los años lo meto en una variable $ano por ejemplo y en la consulta le pogo ='$ano' no se si esta bien o no, asi me muestra todos los años, pero bueno tampoco es tan importante, de momento me funciona asi.

Última edición por pakillo; 09/01/2009 a las 05:07
  #14 (permalink)  
Antiguo 11/01/2009, 06:18
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 20 años
Puntos: 0
Respuesta: como mostrar los resultados ordenados al utilizar sum que depende de otra

Muchas gracias jurena ya funciona, no se que hice me puse a cambair alguna cosa y volver a escribir la consulta hasta dar con loq ue allaba y al final ha funcionado luego le agrege al final order by puntos desc para que lo ordene por puntos y ya esta, seguramente escribi algo mal la primera vez como me paso con la coma jejejeje, todo resuelto, lo del año como te dije lo resolvi haciendo antes una consulta de la tabla año asi me muestra las tablas segun el año, asi que no hay ningun problema, muchas gracias :)
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 02:35.