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

Duda para crear rutina

Estas en el tema de Duda para crear rutina en el foro de Mysql en Foros del Web. Hola, estoy intentando aprender algo de MySQL pero me esta resultando bastante dificil. Quier crear un procedimiento (si es que se puede) que llame y ...
  #1 (permalink)  
Antiguo 25/03/2014, 12:02
Avatar de mbm150  
Fecha de Ingreso: enero-2013
Ubicación: Muskiz
Mensajes: 79
Antigüedad: 11 años, 3 meses
Puntos: 21
Pregunta Duda para crear rutina

Hola, estoy intentando aprender algo de MySQL pero me esta resultando bastante dificil.
Quier crear un procedimiento (si es que se puede) que llame y ordene los resultados de un par de tablas y luego las edite.

La idea es:
-Hay dos tablas: jugadores y clases. Mas o menos son así:

clases-> codigo CHAR(3) y grupo VARCHAR(20)
jugadores->nombre, apellidos VARCHAR(20), tantos_marcados SMALLINT y clase CHAR(3)

-Quiero que sume todos los tantos marcados por cada clase y los muestre ordenados de mayor a menor, escribiendo los tantos y el nombre del grupo.

-Después de esto, sumar 2 puntos al primero y 1 al segundo.

Me gustaria ver como lo haceis y si sabeis donde explican bien como funcionan los procedimientos por que no se hacerlo.

De momento he hecho esto:
Código SQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE suma()
  3. BEGIN
  4. DECLARE aula CHAR(3);
  5. DECLARE goles SMALLINT;
  6. SELECT codigo INTO aula FROM clases;
  7. SELECT COUNT(tantos_marcados) INTO goles FROM jugadores WHERE clase = aula;
  8. END &&
  9. DELIMITER ;

Voy bien? Como sigo?

Muchas gracias por la ayuda.
  #2 (permalink)  
Antiguo 25/03/2014, 17:44
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Duda para crear rutina

Hola mbm150:

No me queda claro cómo tienes almacenada tu información... creo que además de la estructura de tus tablas es conveniente que nos pongas algunos datos te ejemplo, para ver exactamente qué es lo que tienes...

tengo algunas dudas con respecto a la consulta que pones, por ejemplo, hablas de "tantos_marcados", sin embargo en tu consulta estás utilizando la función COUNT... si en tu campo almacenas en número de goles anotados y este puede ser mayor a uno, entonces DEBES UTILIZAR SUM en lugar de COUNT... observa la diferencia de las funciones:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +---------+-----------------+
  3. | jugador | tantos_anotados |
  4. +---------+-----------------+
  5. | CR7     |               1 |
  6. | CR7     |               2 |
  7. | CR7     |               3 |
  8. | MESSI   |               2 |
  9. | MESSI   |               1 |
  10. | MESSI   |               3 |
  11. | MESSI   |               3 |
  12. +---------+-----------------+
  13. 7 rows in set (0.00 sec)
  14.  
  15. mysql> SELECT jugador,
  16.     -> COUNT(tantos_anotados) veces_anotado,
  17.     -> SUM(tantos_anotados) total_anotados
  18.     -> FROM tabla
  19.     -> GROUP BY jugador;
  20. +---------+---------------+----------------+
  21. | jugador | veces_anotado | total_anotados |
  22. +---------+---------------+----------------+
  23. | CR7     |             3 |              6 |
  24. | MESSI   |             4 |              9 |
  25. +---------+---------------+----------------+
  26. 2 rows in set (0.00 sec)


observa que el COUNT, como su traducción lo indica, CUENTA el numero de veces que el campo tantos anotados tiene cada jugador (3 y 4, respectivamente), mientras que el SUM, también como su nombre lo indica SUMA los tantos anotados por cada jugador (6 y 9, respectivamente).

Ahora bien, en tu sentencia NO UTILIZAS LA CLÁUSULA GROUP BY, por lo tanto, TE HARÁ LA SUMA Y EL CONTEO DE TODOS LOS REGISTROS DE LA TABLA, sin tener en cuenta los grupos o jugadores:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> COUNT(tantos_anotados) veces_anotado,
  3.     -> SUM(tantos_anotados) total_anotados
  4.     -> FROM tabla ;
  5. +---------------+----------------+
  6. | veces_anotado | total_anotados |
  7. +---------------+----------------+
  8. |             7 |             15 |
  9. +---------------+----------------+
  10. 1 row in set (0.01 sec)


Ojo con eso. Finalmente, debes tener cuidado con el uso de las variables... por un lado declara la variable "aula" como CHAR(3), sin embargo NUNCA LE ASIGNAS NINGÚN VALOR. Por lo tanto, es posible que tengas un error por este motivo.

Saludos
Leo
  #3 (permalink)  
Antiguo 26/03/2014, 10:23
Avatar de mbm150  
Fecha de Ingreso: enero-2013
Ubicación: Muskiz
Mensajes: 79
Antigüedad: 11 años, 3 meses
Puntos: 21
Pregunta Respuesta: Duda para crear rutina

Tienes razón, me interesa usar SUM, gracias.

Las tablas son así:

-La tabla de jugadores

Código SQL:
Ver original
  1. +----------------+----------------+---------------+---------------+-----+
  2. |codalumno       | nombre         | apellido      |tantos_marcados|clase|
  3. +----------------+----------------+---------------+---------------+-----+
  4. |aaa017          | pablo          |garcia         |16             |aaa  |
  5. |aaa031          | juan           |sierra         |16             |aaa  |  
  6. |bbb012          | cody           |marin          |14             |bbb  |
  7. |bbb021          | leo            |altieri        |19             |bbb  |  
  8. |ccc003          | kepa           |diana          |12             |ccc  |
  9. |ccc024          | jorge          |merino         |14             |ccc  |
  10. +----------------+----------------+---------------+---------------+-----+

-La tabla de clases

Código SQL:
Ver original
  1. +----------------+----------------+---------------+
  2. |codigo          | grupo          | puntuacion    |
  3. +----------------+----------------+---------------+
  4. |aaa             | 1 ESO          |6              |
  5. |bbb             | 2 ESO          |3              |
  6. |ccc             | 3 ESO          |7              |
  7. +----------------+----------------+---------------+

Lo que quiero hacer es lo siguiente:

-Sumar todos los tantos marcados por los jugadores de cada clase y mostrar el resultado de mayor a menor.

Para el ejemplo puesto debería mostrar:

-33 bbb
-32 aaa
-26 ccc

-Después de mostrarlo, sumar 2 puntos a la puntuación del grupo que mas tantos a marcado y 1 punto al segundo.

Gracias a tu ayuda creo que lo primero ya esta conseguido:

Código SQL:
Ver original
  1. SELECT SUM(tantos_marcados) goles, clase aula FROM jugadores GROUP BY clase DESC;

Ahora la cuestion es, como actualizo para sumarle 2 puntos al priemro y 1 al segundo?

Muchas gracias por la ayuda

Etiquetas: rutina, select, sql, tabla
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 23:26.