Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/10/2011, 08:45
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
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.