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

Cómo hago para almacenar diferentes variables y ordenarlas?

Estas en el tema de Cómo hago para almacenar diferentes variables y ordenarlas? en el foro de Mysql en Foros del Web. Hola, perdonad, tengo esta tabla SQL: NOMBRE, COMPETICION, GOLES Manolito, Liga, 2 Manolito, Copa, 0 Manolito, Mundial, 5 Pepito, Liga, 1 Pepito, Copa, 3 Pepito, ...
  #1 (permalink)  
Antiguo 26/07/2012, 16:59
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Cómo hago para almacenar diferentes variables y ordenarlas?

Hola, perdonad, tengo esta tabla SQL:

NOMBRE, COMPETICION, GOLES
Manolito, Liga, 2
Manolito, Copa, 0
Manolito, Mundial, 5
Pepito, Liga, 1
Pepito, Copa, 3
Pepito, Mundial, 2

Cómo podría hacer que se sumaran todos los goles de cada jugador y luego me ordenara los jugadores por total de goles y que también me pusiera los goles por cada competición de la siguiente manera?

NOMBRE, LIGA, COPA, MUNDIAL, TOTAL
Manolito, 2, 0, 5, 7
Pepito, 1, 3, 2, 6



Si pongo ésto:

$goles = mysql_query("SELECT nombre, competicion, goles, temporada
FROM jugadores
WHERE temporada=(SELECT MAX(temporada) FROM jugadores)
ORDER BY goles DESC", $link);


Me imprime:

Manolito, 5
Pepito, 3
Manolito, 2
Pepito, 2
Pepito, 1
Manolito, 0


A ver si me podéis ayudar.
Muchas gracias.
  #2 (permalink)  
Antiguo 27/07/2012, 07:14
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: Cómo hago para almacenar diferentes variables y ordenarlas?

Es una consulta de manual. Te conviene buscar un tutorial básico para comprender estos detalles porque son el ABC de las consultas.

Si quieres discriminado por jugador y competición:
Código SQL:
Ver original
  1. SELECT
  2.     nombre, competicion, SUM(goles) goles, MAX(temporada) Temporada
  3. FROM jugadores
  4. GROUP BY nombre, competicion
  5. ORDER BY goles DESC

Si lo quieres sólo por jugador:
Código SQL:
Ver original
  1. SELECT
  2.     nombre, competicion, SUM(goles) goles, MAX(temporada) Temporada
  3. FROM jugadores
  4. GROUP BY nombre, competicion
  5. ORDER BY goles DESC
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 27/07/2012, 09:35
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Muchas gracias por contestar gnzsoloyo.
No estoy muy familiarizado con MySQL...
Me sirvió a medias lo que me dijiste.

Si hago:
Código PHP:
$champ mysql_query("SELECT competicion, nombre, SUM(goles), temporada
FROM competicion
WHERE temporada=(SELECT MAX(temporada) FROM competicion)
GROUP BY nombre, competicion
ORDER BY goles DESC"
$link); 
Me da:
Manolito, 5
Pepito, 3
Manolito, 2
Pepito, 2
Pepito, 1
Manolito, 0


Si hago (que supongo que es lo que querías decir en discriminado por jugador, se te ha colado el "group by competicion"):
Código PHP:
$champ mysql_query("SELECT competicion, nombre, SUM(goles), temporada
FROM competicion
WHERE temporada=(SELECT MAX(temporada) FROM competicion)
GROUP BY nombre
ORDER BY goles DESC"
$link); 
Lo suma bien, pero no sé por qué no lo ordena Y no entiendo por qué no...
  #4 (permalink)  
Antiguo 27/07/2012, 09:39
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: Cómo hago para almacenar diferentes variables y ordenarlas?

Muestra a qué te refieres conque "no ordena".
Postea la tabla resultado que obtienes tu, para ver cómo lo está haciendo.
Pero no la obtengas por tu aplicación. Pruébalo usando phpMyadmin y copiando la consulta que usas en el panel de SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 27/07/2012, 09:56
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Lo tengo puesto con dorsales, no con nombres. La consulta sería ésta:
Código PHP:
SELECT `DORSAL` , `TIPO` , SUM( `GOLES` ) , MAX( `TEMPORADA` )
FROM `CAMPEONATO`
GROUP BY `DORSAL`
ORDER BY `GOLESDESC 
Y me devuelve esta tabla:
DORSAL TIPO SUM( `GOLES` ) MAX( `TEMPORADA` )
9 Copa 63 2012
4 Copa 6 2012
2 Lliga 3 2012
7 Amistos 44 2012
21 Amistos 5 2012
5 Copa 8 2012
6 Amistos 24 2012
8 Lliga 14 2012
23 Copa 5 2012
24 Copa 0 2012
  #6 (permalink)  
Antiguo 27/07/2012, 10:06
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: Cómo hago para almacenar diferentes variables y ordenarlas?

Pareciera un error de tipo de dato.

Ejecuta esto, y postea el resultado:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE CAMPEONATO;

Veremos la estructura real de los datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 27/07/2012, 10:09
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Hola sToRaGe:

Voy meter mi cuchara en este tema. OJO, hay una pequeña gran diferencia entre lo que pone gnzsoloyo y lo que estás poniendo tú. gnzsoloyo en su post pone algo como esto:

Código:
... 
SUM(goles) goles, MAX(temporada) Temporada
...
ORDER BY goles DESC
mientras que estás poniendo esto

Código:
...
SUM( `GOLES` ) , MAX( `TEMPORADA` ) 
..
ORDER BY `GOLES` DESC
Observa que gnzsoloyo está poniendo un ALIAS al campo... por lo tanto, al ponerlo en el ORDER BY se refiere al CAMPO CALCULADO, es decir al campo ya sumarizado. En tu caso no estás colocando ningún ALIAS por lo tanto, al ponerlo en el ORDER BY haces referencia al campo individual, es decir, antes de sumarizarse.

Hay otra forma de obtener el resultado que ponías al inicio, y es con sumas condicionales, checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +----------+-------------+-------+
  3. | nombre   | competicion | goles |
  4. +----------+-------------+-------+
  5. | Manolito | Liga        |     2 |
  6. | Manolito | Copa        |     0 |
  7. | Manolito | Mundial     |     5 |
  8. | Pepito   | Liga        |     1 |
  9. | Pepito   | Copa        |     3 |
  10. | Pepito   | Mundial     |     2 |
  11. +----------+-------------+-------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT
  15.     ->   nombre,
  16.     ->   SUM(IF(competicion = 'Liga', goles, 0)) Liga,
  17.     ->   SUM(IF(competicion = 'Copa', goles, 0)) Copa,
  18.     ->   SUM(IF(competicion = 'Mundial', goles, 0)) Mundial,
  19.     ->   SUM(goles) Total
  20.     -> FROM tabla
  21.     -> GROUP BY nombre
  22.     -> ORDER BY Total DESC;
  23. +----------+------+------+---------+-------+
  24. | nombre   | Liga | Copa | Mundial | Total |
  25. +----------+------+------+---------+-------+
  26. | Manolito |    2 |    0 |       5 |     7 |
  27. | Pepito   |    1 |    3 |       2 |     6 |
  28. +----------+------+------+---------+-------+
  29. 2 rows in set (0.00 sec)

Observa que el ORDER BY se haces sobre el ALIAS que estoy declarando (TOTAL) es decir, sobre la suma.

Dale un vistazo y nos comentas.

Saludos
Leo.
  #8 (permalink)  
Antiguo 27/07/2012, 10:13
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Creo que ya lo he solucionado, me faltaba el "as goles"

$champ = mysql_query("SELECT TEMPORADA, TIPO, DORSAL, SUM(GOLES) AS GOLES
FROM CAMPEONATO
WHERE TEMPORADA=(SELECT MAX(TEMPORADA) FROM CAMPEONATO)
GROUP BY DORSAL
ORDER BY GOLES DESC", $link);


De todos modos te pongo lo que me pediste, por si encuentras algún error o algo que corregir, que ésto no es lo mio xD

Table
CAMPEONATO

Create Table
CREATE TABLE `CAMPEONATO` (
`TEMPORADA` int(11) NOT NULL default '2012',
`TIPO` varchar(10) collate latin1_german2_ci NOT NULL default 'Liga',
`DORSAL` int(2) NOT NULL,
`GOLES` int(11) default NULL,
PRIMARY KEY (`DORSAL`,`TIPO`,`TEMPORADA`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci
  #9 (permalink)  
Antiguo 27/07/2012, 10:19
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: Cómo hago para almacenar diferentes variables y ordenarlas?

El "AS" no es necesario. Es completamente opcional desde hace muchos años. Lo que debes hacer siempre que usas funciones agregadas es poner el alias, pero no necesitas indicar el AS, porque lo reconoce de la misma forma.
Si te fijas con cuidado, yo lo había puesto:
Código MySQL:
Ver original
  1.     nombre, competicion, SUM(goles) goles, MAX(temporada) Temporada
  2. FROM jugadores
  3. GROUP BY nombre
La próxima vez copia bien. Te evitaras perder el tiempo y enredarte en problemas que en realidad no son tales.

( Leo siempre cerquita.... )
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 27/07/2012, 10:22
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Gracias leonardo_josue, creo que lo que comentas es justo lo que dije del as goles, ¿no?

Muchas gracias a los 2 por vuestro tiempo.
  #11 (permalink)  
Antiguo 27/07/2012, 10:25
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El "AS" no es necesario. Es completamente opcional desde hace muchos años. Lo que debes hacer siempre que usas funciones agregadas es poner el alias, pero no necesitas indicar el AS, porque lo reconoce de la misma forma.
Si te fijas con cuidado, yo lo había puesto:
Código MySQL:
Ver original
  1.     nombre, competicion, SUM(goles) goles, MAX(temporada) Temporada
  2. FROM jugadores
  3. GROUP BY nombre
La próxima vez copia bien. Te evitaras perder el tiempo y enredarte en problemas que en realidad no son tales.

( Leo siempre cerquita.... )
Lo vi, por eso se me ocurrió poner el AS GOLES. Lo había visto y lo quité porque pensaba que era como el FROM de la siguiente línea...
Otra evidencia más que no estoy muy familiarizado con bases de datos ni consultas.
Lo siento y nuevamente muchas gracias.
  #12 (permalink)  
Antiguo 27/07/2012, 10:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Justamente, eso era lo que estaba comentando... Por eso lo puse con ROJO para hacer enfasis jejejeje

Cita:
gnzsoloyo en su post pone algo como esto:

Código:
... 
SUM(goles) goles, MAX(temporada) Temporada
...
ORDER BY goles DESC
mientras que estás poniendo esto

Código:
Código:
...
SUM( `GOLES` ) , MAX( `TEMPORADA` ) 
..
ORDER BY `GOLES` DESC
Dale un vistazo también a la segunda parte de mi post... la consulta sirve para presentar la información en columnas y no en filas... creo que es lo que querías hacer originalmente.

Saludos
Leo.
  #13 (permalink)  
Antiguo 27/07/2012, 11:10
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Cita:
Iniciado por leonardo_josue Ver Mensaje
Justamente, eso era lo que estaba comentando... Por eso lo puse con ROJO para hacer enfasis jejejeje



Dale un vistazo también a la segunda parte de mi post... la consulta sirve para presentar la información en columnas y no en filas... creo que es lo que querías hacer originalmente.

Saludos
Leo.
Exacto, es lo que estoy probando, por ahora no consigo que salga...
  #14 (permalink)  
Antiguo 27/07/2012, 11:24
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Supongo que algo pondré mal en el phpmyadmin. Pongo lo siguiente (supongo que habrá además algún error con el uso de '' y ``):

SELECT `DORSAL`,`TIPO`,SUM(IF(TIPO='Liga',`GOLES`,0)) LIGA`,SUM(IF(TIPO='Amistoso',`GOLES`,0)) `AMISTOSO`,SUM(IF(TIPO='Copa',`GOLES`,0)) `COPA`,SUM(`GOLES`) `TOTAL`, MAX(`TEMPORADA`) `TEMPORADA`,
FROM `CAMPEONATO`,
GROUP BY `DORSAL`,
ORDER BY `TOTAL` DESC
  #15 (permalink)  
Antiguo 27/07/2012, 11:28
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: Cómo hago para almacenar diferentes variables y ordenarlas?

Código MySQL:
Ver original
  1.     `DORSAL`,
  2.     `TIPO`,
  3.     SUM(IF(TIPO = 'Liga', `GOLES`, 0)) LIGA`,
  4.    SUM(IF(TIPO = 'Amistoso', `GOLES`, 0)) `AMISTOSO`,
  5.    SUM(IF(TIPO = 'Copa', `GOLES`, 0)) `COPA`,
  6.    SUM(`GOLES`) `TOTAL`,
  7.    MAX(`TEMPORADA`) `TEMPORADA`
  8. FROM `CAMPEONATO`
  9. GROUP BY `DORSAL`
  10. ORDER BY `TOTAL` DESC
Tienes comas metidas detrás de la última columna en el SELECT, de la tabla y del GROUP BY.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 27/07/2012, 11:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Jajaja... Otra vez me ganaste gnzsoloyo... hay otro error en el alias para liga... o una de dos, colocas LIGA entre (`) o lo pones solo:

Código:
...
LIGA`,
...
Saludos
Leo.
  #17 (permalink)  
Antiguo 27/07/2012, 12:01
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

No hace bien la suma, muestra:

DORSAL TIPO LIGA AMISTOSO COPA TOTAL TEMPORADA
9 Copa 41 3 19 63 2012
7 Amistoso 28 2 14 44 2012
6 Amistoso 15 1 8 24 2012
8 Liga 5 1 8 14 2012
5 Copa 6 0 2 8 2012
4 Copa 0 0 6 6 2012
23 Copa 3 0 2 5 2012
21 Amistoso 4 1 0 5 2012
2 Liga 3 0 0 3 2012
24 Copa 0 0 0 0 2012

Pero por ejemplo el jugador con el dorsal 9 tiene realmente en Liga:17, en Amistoso:3 y en Copa:6
xD
  #18 (permalink)  
Antiguo 27/07/2012, 13:08
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

sToRaGe:

Ya te habrás dado cuenta de que con copiar y pegar dificilmente vas a llegar a una solución a tus problemas... Antes de continuar te sugiero encarecidamente LEE CUIDADOSAMENTE LO QUE TE ESTAMOS PONIENDO EN EL POST Y ANALIZA UN POCO EL CÓDIGO. Si no haces esto podremos llevarnos todo el día sin que encuentres finalmente algo que se adecue a lo que necesites.

El ejemplo que te puse ESTÁ BASADO EN LOS PRIMEROS DATOS QUE PUSISTE DE EJEMPLO y si observas detenidamente te darás cuenta de que funciona perfectamente... esto es para que te sirviera de GUÍA, pero era obvio que necesitaba hacer ajustes.

En primer lugar, Si el TIPO lo vas a considerar como columna entonces DEBES QUITARLO DEL SELECT, sino se repetirá también como renglón.

Segundo, si la idea es extraer la información sólo de la última temporada, entonces DEBES FILTRAR LOS DATOS para solo tomar justamente los de la última temporada...

Código MySQL:
Ver original
  1. mysql> SELECT * FROM campeonato;
  2. +-----------+----------+--------+-------+
  3. | TEMPORADA | TIPO     | DORSAL | GOLES |
  4. +-----------+----------+--------+-------+
  5. |      2012 | Liga     |      9 |    10 |
  6. |      2012 | Amistoso |      9 |     6 |
  7. |      2012 | Copa     |      9 |     2 |
  8. |      2012 | Liga     |     10 |    11 |
  9. |      2012 | Amistoso |     10 |     4 |
  10. |      2012 | Copa     |     10 |     1 |
  11. |      2011 | Liga     |      9 |     7 |
  12. |      2011 | Amistoso |      9 |     6 |
  13. |      2011 | Copa     |      9 |     2 |
  14. |      2011 | Liga     |     10 |     8 |
  15. |      2011 | Amistoso |     10 |     3 |
  16. |      2011 | Copa     |     10 |     5 |
  17. +-----------+----------+--------+-------+
  18. 12 rows in set (0.00 sec)
  19.  
  20. mysql> SELECT
  21.     ->   temporada,
  22.     ->   dorsal,
  23.     ->   SUM(IF(tipo='Liga', goles,0)) Liga,
  24.     ->   SUM(IF(tipo='Amistoso',goles,0)) Amistoso,
  25.     ->   SUM(IF(tipo='Copa',goles,0)) Copa,
  26.     ->   SUM(goles) Total
  27.     -> FROM campeonato
  28.     -> GROUP BY dorsal, temporada
  29.     -> ORDER BY temporada, total DESC;
  30. +-----------+--------+------+----------+------+-------+
  31. | temporada | dorsal | Liga | Amistoso | Copa | Total |
  32. +-----------+--------+------+----------+------+-------+
  33. |      2011 |     10 |    8 |        3 |    5 |    16 |
  34. |      2011 |      9 |    7 |        6 |    2 |    15 |
  35. |      2012 |      9 |   10 |        6 |    2 |    18 |
  36. |      2012 |     10 |   11 |        4 |    1 |    16 |
  37. +-----------+--------+------+----------+------+-------+
  38. 4 rows in set (0.00 sec)

Observa en la consulta que en el SELECT NO SE ESTÁ CONSIDERANDO EL CAMPO TIPO, observa también que la temporada SI SE INCLUYE EN EL SELECT, pues es un criterio de agrupación, y por lo tanto TAMBIÉN SE CONSIDERA EN EL GROUP BY...

Tómate un tiempo para analizar la consulta...

Saludos
Leo.
  #19 (permalink)  
Antiguo 27/07/2012, 16:34
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Cómo hago para almacenar diferentes variables y ordenarlas?

Ok, ya está solucionado.
Lo que comentas de agrupar por temporada no lo he hecho porque no quiero que muestre todas las temporadas, sólo la última. Pensaba que el filtro de la temporada lo hacía con el MAX(TEMPORADA) TEMPORADA
Lo que fallaba era eso, he tenido que ponerlo como WHERE TEMPORADA=(SELECT MAX(TEMPORADA) FROM CAMPEONATO) y ahora ya hace bien el filtro, incluso sin agruparlo.
Y lo que comentas del TIPO no había caído en la cuenta.
Muchas gracias por las explicaciones.

Etiquetas: almacenar, sql, tabla, variables
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:45.