Ayuda con consulta en mysql.

Iniciado por 1mpuls0, 27 Diciembre 2012, 01:33 AM

0 Miembros y 1 Visitante están viendo este tema.

1mpuls0

Hola.
Estoy realizando una consulta para obtener la cantidad de premios de un jugador de un premio en especifico, pero no lo consigo :/
Por ejemplo tengo la siguiente tabla.
El jugador 2 tiene el premio 5 un total de 3 veces y el jugador 3 tiene el premio 1 un total de 2 veces.

Código (sql) [Seleccionar]

mysql> SELECT * FROM awards;
+---------+--------+-------+-------+
| section | player | award | total |
+---------+--------+-------+-------+
|       1 |      2 |     5 |     1 |
|       1 |      3 |     1 |     2 |
|       2 |      2 |     5 |     2 |
+---------+--------+-------+-------+
3 rows in set (0.00 sec)

mysql>


Quiero obtejer el siguiente resultado.

Código (sql) [Seleccionar]

+---------+--------+-------+
| award1| award5| player|
+---------+--------+-------+
|       2 |      0 |     3 |
|       0 |      3 |     2 |
+---------+--------+-------+


Esto significa que player 3 tiene el award1 2 veces y el award5 0 veces. De igual forma player 2 tiene el award1 0 veces y el award5 3 veces.

Alguna sugerencia?.

Estoy intentando con esta parte en la consulta... :/ es para obtener la suma de los premios, pero necesito un alias para cada premio... awardi hasta awardn con sus respectivos jugadores y cantidades.

Código (sql) [Seleccionar]

SELECT SUM(total), player FROM awards WHERE award=5 GROUP BY player


Aquí les dejo la estructura de la tabla.

Código (sql) [Seleccionar]

CREATE TABLE `awards` ( `section` int(40) NOT NULL, `player` int(20) NOT NULL, `award` int(2) NOT NULL, `total` int(2) NOT NULL, PRIMARY KEY (`section`,`player`,`award`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci


Gracias
abc

Shell Root

Optaría mejor por crear un procedimiento almacenado, -la opción más rapida :p-
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

1mpuls0

Gracias Shell Root.

Alguna idea de que debo hacer primero?... es decir.. agrupar por players, separar por awards o sumar?.
Aunque por otro lado los procedimientos me muestran el resultado pero al trabajar con mysql_fetch_array no me recoge los valores :/ (ya lo intenté así -> http://www.phpgang.com/mysql-stored-procedure-in-php_9.html y no funcionó, pero bueno ese es otro tema).

Alguna otra sugerencia?.

Saludos
abc

moikano→@

#3
La estructura de la tabla no lo encuentro de mi gusto, ya que el total se puede calcular y no hace falta almacenarlo en una columna, pero supongo que tendrás tus razones para hacerla así.

Lo que quieres creo que se consigue con una subconsulta.

Mas o menos sería así, pero estoy con otras cosas y no tengo tiempo de pensar la subconsulta para ordenar el resultado.

SELECT award,count(award) as 'cantidad' ,player FROM awards GROUP BY player;

Este es el resultado:

+-------+----------+--------+
| award | cantidad | player |
+-------+----------+--------+
|     1 |        1 |      3 |
|     5 |        2 |      2 |
+-------+----------+--------+






1mpuls0

Gracias...

Si de hecho es una tabla de ejemplo y fue lo primero que se me ocurrió, la tabla original es más extensa... (más premios)

Lo que quiero es saber cuantos premios P1, P2, P3... PN tiene el jugador X y mostrar como una tabla de Premios, Cantidad y Jugadores.

La consulta que dices es más o menos lo que busco, pero en lugar de tener una columna llamada award sería cambiar el valor de un award por un nombre y colocarlo como columna (método del pivot) pero aun no lo consigo :/
Tal vez tendré que hacerlo con programación xD..

Gracias
abc

moikano→@

CitarTal vez tendré que hacerlo con programación

La verdad es que tengo mis dudas de si se puede sacar por consulta, ya que ahí estás creando una columna por cada premio.

No se, pero si retocas el resultado de la consulta que te mostré puedes ordenarlo fácilmente ya que realmente te saca cada premio por cada jugador.

1mpuls0

Al final parece que era algo muy simple.
Gracias por la ayuda.

Código (sql) [Seleccionar]

SELECT
player,
SUM(award=1) AS name_award1,
SUM(award=2) AS name_award2,
SUM(award=3) AS name_award3,
SUM(award=4) AS name_award4,
SUM(award=5) AS name_award5,
SUM(award=6) AS name_award6,
SUM(award=7) AS name_award7,
SUM(award=8) AS name_award8,
SUM(award=9) AS name_award9,
SUM(award=10) AS name_awardN
FROM awards GROUP BY player


Saludos
abc