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

Ranking de parejas...

Estas en el tema de Ranking de parejas... en el foro de Mysql en Foros del Web. Hola foro!!! Antes de nada, muchas gracias por leerme ;) Tengo una tabla donde almaceno unas puntuaciones por parejas, pero dependiendo de cómo se introducen ...
  #1 (permalink)  
Antiguo 25/10/2011, 07:45
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 649
Antigüedad: 19 años, 3 meses
Puntos: 2
Ranking de parejas...

Hola foro!!! Antes de nada, muchas gracias por leerme ;)

Tengo una tabla donde almaceno unas puntuaciones por parejas, pero dependiendo de cómo se introducen los usuarios para indicar las parejas así es como queda reflejado... me explido:

id | usuario1 | usuario2 | puntos
--------------------------------------------
1 | 58 | 71 | 3
2 | 4 | 35 | 4
3 | 71 | 58 | 2
4 | 58 | 71 | 3
5 | 42 | 15 | 1
6 | 71 | 58 | 2


La cuestión es que al hacer la query que me sume los puntos de las parejas repetidas me toma los ids 1, 4 iguales, pero el 3 como si fuera una pareja nueva...

¿Cómo debería formular la query para que me lo tomase como una misma pareja?

Muchas gracias!!!
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #2 (permalink)  
Antiguo 25/10/2011, 08:45
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 16 años, 1 mes
Puntos: 447
Respuesta: Ranking de parejas...

Hola X3mdesign:

Aquí tienes un problema de modelado de tablas, lo ideal sería que tengas una tabla extra donde definas tus parejas de tal manera que en tu tabla de puntuaciones manejes un solo índice... sin embargo eso no quita el hecho de tener que validar que una combinación ya exista en la tabla... por lo pronto y como tienes tus datos, se me ocurre que reorganices tu tabla, de tal manera que el usuario1 siempre sea el id menor, y el usuario2 siempre sea el mayor (no debería darse el caso de que los id's sean los mismos, pero eso debería validarlo también). el script sería más o menos así:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE parejas (id INT, usuario1 INT, usuario2 INT, puntos INT);
  2. Query OK, 0 rows affected (0.11 sec)
  3.  
  4. mysql> INSERT INTO parejas VALUES
  5.     -> (1, 58, 71, 3),(2, 4, 35, 4),(3, 71, 58, 2),
  6.     -> (4, 58, 71, 3),(5, 42, 15, 1),(6, 71, 58, 2);
  7. Query OK, 6 rows affected (0.05 sec)
  8. Records: 6  Duplicates: 0  Warnings: 0
  9.  
  10. mysql> SELECT * FROM parejas;
  11. +------+----------+----------+--------+
  12. | id   | usuario1 | usuario2 | puntos |
  13. +------+----------+----------+--------+
  14. |    1 |       58 |       71 |      3 |
  15. |    2 |        4 |       35 |      4 |
  16. |    3 |       71 |       58 |      2 |
  17. |    4 |       58 |       71 |      3 |
  18. |    5 |       42 |       15 |      1 |
  19. |    6 |       71 |       58 |      2 |
  20. +------+----------+----------+--------+
  21. 6 rows in set (0.00 sec)
  22.  
  23. mysql> SELECT id, usuario1, usuario2, puntos
  24.     -> FROM parejas WHERE parejas.usuario1 < parejas.usuario2
  25.     -> UNION
  26.     -> SELECT id, usuario2, usuario1, puntos
  27.     -> FROM parejas WHERE parejas.usuario1 > parejas.usuario2;
  28. +------+----------+----------+--------+
  29. | id   | usuario1 | usuario2 | puntos |
  30. +------+----------+----------+--------+
  31. |    1 |       58 |       71 |      3 |
  32. |    2 |        4 |       35 |      4 |
  33. |    4 |       58 |       71 |      3 |
  34. |    3 |       58 |       71 |      2 |
  35. |    5 |       15 |       42 |      1 |
  36. |    6 |       58 |       71 |      2 |
  37. +------+----------+----------+--------+
  38. 6 rows in set (0.02 sec)
  39.  
  40. mysql> SELECT usuario1, usuario2, SUM(puntos) FROM
  41.     -> (SELECT id, usuario1, usuario2, puntos
  42.     -> FROM parejas WHERE parejas.usuario1 < parejas.usuario2
  43.     -> UNION
  44.     -> SELECT id, usuario2, usuario1, puntos
  45.     -> FROM parejas WHERE parejas.usuario1 > parejas.usuario2
  46.     -> ) T GROUP BY usuario1, usuario2;
  47. +----------+----------+-------------+
  48. | usuario1 | usuario2 | SUM(puntos) |
  49. +----------+----------+-------------+
  50. |        4 |       35 |           4 |
  51. |       15 |       42 |           1 |
  52. |       58 |       71 |          10 |
  53. +----------+----------+-------------+
  54. 3 rows in set (0.00 sec)

Observa que con la consulta donde utilizo el UNION los registros 3 y 6 cambian, poniendo en primer lugar el id menor... finalmente en el último select agrupo por ambos id's para obtener el total de puntos por pareja.

Dale un vistazo para ver si es lo que necesitas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 25/10/2011, 08:58
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 649
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Ranking de parejas...

Gracias Leo por la rápida respuesta... lo que comentas a la hora de hacer la query con UNION lo podría hacer manualmente indicando siempre a la hora de hacer el INSERT del resultado colocando como usuario1 al jugador con el id más bajo... verdad??

¿¿Crees que es preferible esta otra opción para no saturar en un cálculo así al servidor mySQL??

Gracias de nuevo!!! Y sobre todo por la gran explicación, es lo más útil!!!
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #4 (permalink)  
Antiguo 25/10/2011, 09:05
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 16 años, 1 mes
Puntos: 447
Respuesta: Ranking de parejas...

Hola de nuevo X3mdesign:

Sería ideal que siempre te aseguraras de poner el menor id como usuario1, poniendo la restricción a nivel de BD, pues efectivamente, hace una unión puede resultar bastante lento si manejas una cantidad considerable de registros.

Saludos
Leo
  #5 (permalink)  
Antiguo 25/10/2011, 09:07
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 649
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Ranking de parejas...

Cita:
Iniciado por leonardo_josue Ver Mensaje
... poniendo la restricción a nivel de BD...
A qué te refieres?? se puede indicar en la estructura una restricción así?
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #6 (permalink)  
Antiguo 25/10/2011, 12:24
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 16 años, 1 mes
Puntos: 447
Respuesta: Ranking de parejas...

Por lo que se puede ver, no tienes mucha experiencia con el motor, por lo que te recomiendo que leas acerca de los TRIGGERS o Disparadores.

Estos se ejecutan antes o despues de insertar, actualizar o borrar los registros... por lo que te permite hacer validaciones o acciones adicionales.
Ahí podrías comparar que el usuario1 sea menor al usuario2, si no se cumple entonces intercambiarlos o marcar error, según tu lógica de negocio... sería más o menos así:

Código MySQL:
Ver original
  1. mysql> select * from parejas;
  2. +------+----------+----------+--------+
  3. | id   | usuario1 | usuario2 | puntos |
  4. +------+----------+----------+--------+
  5. |    1 |        1 |        2 |      1 |
  6. |    2 |        1 |        2 |      1 |
  7. +------+----------+----------+--------+
  8. 2 rows in set (0.09 sec)
  9.  
  10. mysql> #creamos el trigger o disparador
  11. mysql> DELIMITER $$
  12. mysql> CREATE TRIGGER parejas_chk BEFORE INSERT
  13.     ->     ON parejas
  14.     ->     FOR EACH ROW
  15.     ->     BEGIN
  16.     ->         DECLARE temp INT;
  17.     ->  IF NEW.usuario1 > NEW.usuario2 THEN
  18.     ->          SET temp = NEW.usuario1;
  19.     ->          SET NEW.usuario1 = NEW.usuario2;
  20.     ->          SET NEW.usuario2 = temp;
  21.     ->  END IF;
  22.     ->     END$$
  23. Query OK, 0 rows affected (0.10 sec)
  24.  
  25. mysql> DELIMITER ;
  26.  
  27. mysql> #insertamos un registro con los id's correctos
  28. mysql> insert into parejas values (3, 58, 71, 1);
  29. Query OK, 1 row affected (0.09 sec)
  30.  
  31. mysql> select * from parejas;
  32. +------+----------+----------+--------+
  33. | id   | usuario1 | usuario2 | puntos |
  34. +------+----------+----------+--------+
  35. |    1 |        1 |        2 |      1 |
  36. |    2 |        1 |        2 |      1 |
  37. |    3 |       58 |       71 |      1 |
  38. +------+----------+----------+--------+
  39. 3 rows in set (0.00 sec)
  40.  
  41. mysql> #insertamos un registro con los id's incorrectos;
  42. mysql> insert into parejas values (4, 71, 58, 1);
  43. Query OK, 1 row affected (0.17 sec)
  44.  
  45. mysql> select * from parejas;
  46. +------+----------+----------+--------+
  47. | id   | usuario1 | usuario2 | puntos |
  48. +------+----------+----------+--------+
  49. |    1 |        1 |        2 |      1 |
  50. |    2 |        1 |        2 |      1 |
  51. |    3 |       58 |       71 |      1 |
  52. |    4 |       58 |       71 |      1 |
  53. +------+----------+----------+--------+
  54. 4 rows in set (0.00 sec)

Observa que el registro 4, aunque se envían los id's de los usuarios al revés, el trigger los cambia, para dejar siempre el menor en primer lugar. Este tema es bastante amplio y te aseguro que te puede ser de mucha utilidad en el futuro, así es que tomate algún tiempo para investigar más y hacer algunos ejemplos (por ejemplo podrías validar que los puntos asignados estén entre un rango definido)

NOTA: el TRIGGER sólo se crea una vez, no hay necesidad de poner todo el código cada vez que ejecutas la consluta... lo hice así para demostrar el funcionamiento.

Saludos
Leo.
  #7 (permalink)  
Antiguo 25/10/2011, 13:50
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 649
Antigüedad: 19 años, 3 meses
Puntos: 2
Respuesta: Ranking de parejas...

qué bueno Leo... le echeré un vistazo a lo que comentas... anque parece quedesde phpMyAdmin no lo pueod ejecutar... lo tendré que hacer a través de la consola...

Tienes razón en cuanto al motor de mySQL... soy tenaz y encuentro la forma de realizar más o menos lo que quiero... pero soy consciente de que unos mySQL de una forma muy superficial... poco a poco ;)

Gracias de nuevo, Luis.
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour

Etiquetas: query, ranking, 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 19:52.