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

Contar (duda)

Estas en el tema de Contar (duda) en el foro de Mysql en Foros del Web. Buenas, lo que necesito hacer y no lo se hacer por eso estoy aqui es lo siguiente: Tengo una base de datos con 3 tablas ...
  #1 (permalink)  
Antiguo 17/01/2013, 09:49
 
Fecha de Ingreso: junio-2009
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Contar (duda)

Buenas, lo que necesito hacer y no lo se hacer por eso estoy aqui es lo siguiente:

Tengo una base de datos con 3 tablas que se reparten de la siguiente manera:
1- fechas ( id_f - dia - mes - ano)
2- jugadores (id_j - jugador)
3- partidos (id - jugador_id - asistencia - fecha_id)

Tengo un SELECT que es el siguiente:
Código MySQL:
Ver original
  1. FROM partidos
  2. JOIN fechas ON (partidos.fecha_id = fechas.id_f) JOIN jugadores
  3. ON (partidos.jugador_id = jugadores.id_j) ORDER BY fecha_id
El cual me trae todos los resultados.
Ahora bien, lo que necesito es traer todo lo que me trae ahora pero tambien que el campo "asistencia" me sume todas las asistencias positivas (si estuvo presente) de cada jugador de los ultimos 26 partidos. No tengo idea si es posible hacerlo y si es posible como, la verdad soy novato en esto de php-mysql.

Las asistencias las guardo en la tabla con "si" (si es que estuvo presente) y "no" (si es que no). que calculo que debe ser lo mismo que poner 1-0

Desde les agradezco de antemano.

Última edición por gnzsoloyo; 17/01/2013 a las 10:12 Razón: Código de programacion no permitido en los foros de BBDD.
  #2 (permalink)  
Antiguo 17/01/2013, 13:00
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Contar (duda)

Hola chura78:

Hay que entender una cosa, cuando hablas de "sumar" en base de datos, es necesario hacer una agrupacion (GROUP BY). No entiendo muy bien cómo es que pretendes presentar la información, ya que por un lado mencionas los detalles y por otro los totales... sería conveniente que nos pusieras algunos datos de ejemplo, y que a partir de estos datos nos indiques qué es lo que quieres obtener como salida. Por lo pronto te doy dos ejemplos que igual y te pueden servir. Supongamos que tienes estos datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM jugadores;
  2. +------+---------+
  3. | id_j | jugador |
  4. +------+---------+
  5. |    1 | uno     |
  6. |    2 | dos     |
  7. |    3 | tres    |
  8. |    4 | cuatro  |
  9. |    5 | cinco   |
  10. +------+---------+
  11. 5 rows in set (0.00 sec)
  12.  
  13.  
  14. mysql> SELECT * FROM partidos;
  15. +------+------------+------------+----------+
  16. | id   | jugador_id | asistencia | fecha_id |
  17. +------+------------+------------+----------+
  18. |    1 |          1 | SI         |        1 |
  19. |    2 |          2 | NO         |        1 |
  20. |    3 |          3 | NO         |        2 |
  21. |    4 |          4 | SI         |        3 |
  22. |    5 |          5 | SI         |        3 |
  23. |    6 |          1 | SI         |        3 |
  24. |    7 |          2 | NO         |        3 |
  25. |    8 |          3 | NO         |        4 |
  26. |    9 |          4 | SI         |        4 |
  27. |   10 |          5 | SI         |        4 |
  28. |   11 |          1 | NO         |        5 |
  29. |   12 |          2 | SI         |        5 |
  30. +------+------------+------------+----------+
  31. 12 rows in set (0.00 sec)

Para obtener el número de partidos a los que asistió o faltó algún jugador lo puedes hacer asi:

Código MySQL:
Ver original
  1. mysql> SELECT jugador_id,
  2.     -> jugador,
  3.     -> SUM(IF(asistencia = 'SI', 1, 0)) total_asistencias,
  4.     -> SUM(IF(asistencia = 'NO', 1, 0)) total_faltas
  5.     -> FROM partidos
  6.     -> INNER JOIN jugadores ON partidos.jugador_id = jugadores.id_j
  7.     -> GROUP BY jugador_id, jugador
  8.     -> ORDER BY jugador_id;
  9. +------------+---------+-------------------+--------------+
  10. | jugador_id | jugador | total_asistencias | total_faltas |
  11. +------------+---------+-------------------+--------------+
  12. |          1 | uno     |                 2 |            1 |
  13. |          2 | dos     |                 1 |            2 |
  14. |          3 | tres    |                 0 |            2 |
  15. |          4 | cuatro  |                 2 |            0 |
  16. |          5 | cinco   |                 2 |            0 |
  17. +------------+---------+-------------------+--------------+
  18. 5 rows in set (0.04 sec)

Es decir, haces sumas condicionales, (en programación sería algo así como un contador tipo total = total + 1 para toda la tabla). Otra forma sería haciendo esto:

Código MySQL:
Ver original
  1. mysql> SELECT jugador_id,
  2.     -> jugador,
  3.     -> asistencia,
  4.     -> COUNT(id) total
  5.     -> FROM partidos
  6.     -> INNER JOIN jugadores ON partidos.jugador_id = jugadores.id_j
  7.     -> GROUP BY jugador_id, jugador, asistencia;
  8. +------------+---------+------------+-------+
  9. | jugador_id | jugador | asistencia | total |
  10. +------------+---------+------------+-------+
  11. |          1 | uno     | NO         |     1 |
  12. |          1 | uno     | SI         |     2 |
  13. |          2 | dos     | NO         |     2 |
  14. |          2 | dos     | SI         |     1 |
  15. |          3 | tres    | NO         |     2 |
  16. |          4 | cuatro  | SI         |     2 |
  17. |          5 | cinco   | SI         |     2 |
  18. +------------+---------+------------+-------+
  19. 7 rows in set (0.00 sec)

Dale un vistazo a las consultas, su continuas con problemas, pon los datos y dinos qué es lo que intentaste hacer.

Saludos
Leo.
  #3 (permalink)  
Antiguo 17/01/2013, 16:11
 
Fecha de Ingreso: junio-2009
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Contar (duda)

Leonardo, desde ya muchas gracias por tu tiempo.

Lo que necesito hacer es lo siguiente:

Tengo una planilla en excel de jugadores, fechas de los partidos y las asistencias de cada uno en cada fecha. Esto es para contabilizar quien sera convocado segun las asistencias de cada uno en las ultimos 26 fechas.

Esta planilla es de la siguiente manera:
Jugador 1 | posicion | total asistencias | porcentaje | jugados | sanciones
Jugador 2 | posicion | total asistencias | porcentaje | jugados | sanciones
Asi suscesivamente segun la cantidad de jugadores que haya inscriptos.

El concepto de cada columna es asi:
Posicion: depende del porcentaje total de asistencia sobre las ultimas 26 fechas.
Total asistencias (Puntos): Cuenta el total de asistencias sobre las ultimas 26 fechas menos si llega a haber alguna sancion que se descontaria media asitencia.
Porcentaje: Es el % de asistencias sobre las ultimas 26 fechas.
Jugados: Es el total de jugados.
Sanciones: Muestra la cantidad de sanciones.

He probado los select que has puesto y el segundo que has puesto me ha funcionado, pero nose si me servira para hacer las funciones que te he detallado anteriormente.
Nose si es necesario que inserte algun dato mas.

Mil gracias
Mario

Última edición por chura78; 17/01/2013 a las 16:20
  #4 (permalink)  
Antiguo 19/01/2013, 10:05
 
Fecha de Ingreso: junio-2009
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Contar (duda)

Alguien me ayuda a determinar un limite de 26 registros cuando se hace GROUP BY?

Muchas gracias
mario
  #5 (permalink)  
Antiguo 22/01/2013, 11:43
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Contar (duda)

Hola de nuevo chura78:

en mi primer post te decía que es conveniente que nos pongas algunos datos de ejemplo de tus tablas y que a partir de estos datos nos digas qué es lo que necesitas obtener como resultado...

Estos datos pueden ser inventados, ese no es el detalle... observa que en el ejemplo que te puse primero qué datos eran los que estaba utilizando:

Código:
+------+---------+
| id_j | jugador |
+------+---------+
|    1 | uno     |
|    2 | dos     |
|    3 | tres    |
|    4 | cuatro  |
|    5 | cinco   |
+------+---------+
y a partir de estos datos, pongo la salida:

Código:
+------------+---------+-------------------+--------------+
| jugador_id | jugador | total_asistencias | total_faltas |
+------------+---------+-------------------+--------------+
|          1 | uno     |                 2 |            1 |
|          2 | dos     |                 1 |            2 |
|          3 | tres    |                 0 |            2 |
|          4 | cuatro  |                 2 |            0 |
|          5 | cinco   |                 2 |            0 |
+------------+---------+-------------------+--------------+
Eso es lo que quiero que hagas... las explicaciones que haz dado hasta ahora no son muy claras que digamos, y es por eso que no hemos podido darte una respuesta puntual a tu problema.

Cita:
Alguien me ayuda a determinar un limite de 26 registros cuando se hace GROUP BY?
¿A qué te refieres con esto? si quieres filtrar el número de registros a mostrar, lo podrías hacer con el LIMIT...

http://www.es.hscripts.com/tutoriale...cto-limite.php

Si esto no es lo que necesitas, insisto en que deberás dar una mejor explicación.

Saludos
Leo.

Etiquetas: join, php, resultados, select, sql, tabla, campos
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 06:46.