Ver Mensaje Individual
  #25 (permalink)  
Antiguo 01/06/2013, 06:27
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 4 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN

Por un lado, tienes inconsistencia de datos en una tabla, lo que genera un resultado erróneo:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM torneos_partidos;
  3. +------------+-----------+----------+-----------+-----------+----------------+---------+
  4. | id_partido | id_torneo | id_ronda | user_id_1 | user_id_2 | partido_jugado | ganador |
  5. +------------+-----------+----------+-----------+-----------+----------------+---------+
  6. |          2 |         7 |        1 |        63 |         2 | NO             |       0 |
  7. |          3 |         7 |        1 |        63 |         2 | NO             |       0 |
  8. |          4 |         7 |        2 |         2 |        63 | NO             |       0 |
  9. +------------+-----------+----------+-----------+-----------+----------------+---------+
  10. 3 rows in set (0.00 sec)
Como puedes ver, si bien el partido es distinto entre los dos primeros, aparecen los mismos datos de roda, torneo, y los usuarios en el mismo orden, y eso no puede ser. Si son partidos distintos del mismo torneo, entonces el esquema de partidos no está bien definido.

Esto se produce al cruzar las dos:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM torneos_partidos TP
  3.     ->     INNER JOIN torneos_rondas TR ON TP.id_ronda = TR.id_ronda;
  4. +------------+-----------+----------+-----------+-----------+----------------+---------+----------+--------------------------+
  5. | id_partido | id_torneo | id_ronda | user_id_1 | user_id_2 | partido_jugado | ganador | id_ronda | nombre_ronda             |
  6. +------------+-----------+----------+-----------+-----------+----------------+---------+----------+--------------------------+
  7. |          2 |         7 |        1 |        63 |         2 | NO             |       0 |        1 | Treintaidosavos de final |
  8. |          3 |         7 |        1 |        63 |         2 | NO             |       0 |        1 | Treintaidosavos de final |
  9. |          4 |         7 |        2 |         2 |        63 | NO             |       0 |        2 | Dieciseisavos de final   |
  10. +------------+-----------+----------+-----------+-----------+----------------+---------+----------+--------------------------+
  11. 3 rows in set (0.00 sec)

Con esa inconsistencia, el resultado es:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     TP.id_torneo,
  3.     ->     TR.id_ronda,
  4.     ->     TR.nombre_ronda,
  5.     -> --    TE.id_enfrentamiento -- ,
  6.     ->     TP.user_id_1,
  7.     ->     TI1.username User1,
  8.     ->     TP.user_id_2,
  9.     ->     TI2.username User2
  10.     -> FROM torneos_partidos TP
  11.     ->     INNER JOIN torneos_rondas TR ON TP.id_ronda = TR.id_ronda
  12.     ->     INNER JOIN torneos_inscripcion TI1 ON TP.user_id_1 = TI1.user_id AND TP.id_torneo = TI1.id_torneo
  13.     ->     INNER JOIN torneos_inscripcion TI2 ON TP.user_id_2 = TI2.user_id AND TP.id_torneo = TI2.id_torneo
  14.     -> WHERE TP.id_torneo = 7 AND TP.id_ronda = 1;
  15. +-----------+----------+--------------------------+-----------+---------+-----------+--------+
  16. | id_torneo | id_ronda | nombre_ronda             | user_id_1 | User1   | user_id_2 | User2  |
  17. +-----------+----------+--------------------------+-----------+---------+-----------+--------+
  18. |         7 |        1 | Treintaidosavos de final |        63 | dankko2 |         2 | dankko |
  19. |         7 |        1 | Treintaidosavos de final |        63 | dankko2 |         2 | dankko |
  20. +-----------+----------+--------------------------+-----------+---------+-----------+--------+
  21. 2 rows in set (0.00 sec)
Para descartar la inconsistencia, la consulta propuesta debería quedar así:
Código MySQL:
Ver original
  1.     ->     TP.id_torneo,
  2.     ->     TR.id_ronda,
  3.     ->     TR.nombre_ronda,
  4.     -> --    TE.id_enfrentamiento -- ,
  5.     ->     TP.user_id_1,
  6.     ->     TI1.username User1,
  7.     ->     TP.user_id_2,
  8.     ->     TI2.username User2
  9.     -> FROM torneos_partidos TP
  10.     ->     INNER JOIN torneos_rondas TR ON TP.id_ronda = TR.id_ronda
  11.     ->     INNER JOIN torneos_inscripcion TI1 ON TP.user_id_1 = TI1.user_id AND TP.id_torneo = TI1.id_torneo
  12.     ->     INNER JOIN torneos_inscripcion TI2 ON TP.user_id_2 = TI2.user_id AND TP.id_torneo = TI2.id_torneo
  13.     -> WHERE TP.id_torneo = 7 AND TP.id_ronda = 1;
  14. +-----------+----------+--------------------------+-----------+---------+-----------+--------+
  15. | id_torneo | id_ronda | nombre_ronda             | user_id_1 | User1   | user_id_2 | User2  |
  16. +-----------+----------+--------------------------+-----------+---------+-----------+--------+
  17. |         7 |        1 | Treintaidosavos de final |        63 | dankko2 |         2 | dankko |
  18. +-----------+----------+--------------------------+-----------+---------+-----------+--------+
  19. 1 row in set (0.00 sec)
En realidad el problema es que tienes mal los datos de una tabla y eso genera errores totales, además que los últimso dos join requerían una doble condición.
Por otro lado, si ambos partidos son reales, y corresponden a enfrentamientos Ida/Vuela, no pueden tener los mismos usuarios en el mismo orden. user_id_1 y user_id_2 deben invertirse entre ambos partidos.

Más allá de esto, a mi entender el modelo de datos en general está mal planteado, porque no logra cumplir con los requisitos que necesita una base aplicada a un sistema de torneos por rondas, ni tampoco está bien diseñado el subesquema referido a las inscripciones y los datos de los torneos.
En este último caso hay datos que deberían componer relaciones y no aparecen como tales.
Peor esto último es tema off-topic de PHP. Es asunto de diseño de bases de datos y habría que tratarlo en otro foro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)