Ver Mensaje Individual
  #21 (permalink)  
Antiguo 29/05/2013, 05:32
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, 2 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN

Cita:
Puede ser que esto último que realicé me funcione aunque tenga que mostrar ronda por ronda, pero no se como podría hacer para que a user_id_1 y user_id_2 los relacione con su correspondiente "username" de la tabla de usuarios.
Es medio de manual: Requiere invocar dos veces a la tabla usuario, a fin de relacionar cada invocación con uno de los ID. Obviamente requiere el uso de alias para cada llamada.

Código MySQL:
Ver original
  1. <?php
  2. $conexion = conecta_base_datos();
  3. $id_torneo = (isset($_GET["id"])) ? $_GET["id"] : exit();
  4.  
  5. $ssql = "SELECT TI.id_torneo, TR.id_ronda, TR.nombre_ronda, TE.id_enfrentamiento , TE.`user_id_1`, U1.username User1, TE.`user_id_2`, U2.username User2 ";
  6. $ssql .= "FROM `torneos_partidos` TE ";
  7. $ssql .= "    INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`";
  8. $ssql .= "    INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` ";
  9. $ssql .= "    INNER JOIN `usuarios` U1 ON TE.`user_id_1` = U1.user_id";
  10. $ssql .= "    INNER JOIN `usuarios` U2 ON TE.`user_id_1` = U1.user_id";
  11. $ssql .= "    INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` ";
  12. $ssql .= "WHERE TE.`id_torneo` = '$id_torneo' ";
  13. $ssql .= " ORDER BY id_torneo, TR.id_ronda, U1.username, U2.username";         
  14.  
  15. echo $ssql;
  16.  
  17. $rs = mysql_query($ssql) or die('Error en consulta: ' . mysql_error());
  18.  
  19. while ($fila = mysql_fetch_array($rs)){
  20.  
  21.     // verificando la query
  22.     echo '<a href="' . $fila[user_id_1] . '">' . $fila[User1] . '</a>';
  23.     echo ' vs ';
  24.     echo '<a href="' . $fila[user_id_2] . '">' . $fila[User2] . '</a><br>';
  25. }
  26.  
  27. ?>

Algunas notas:
1) Por cuestiones de eficiencia y eficacia, es mejor que no uses "*" para hacer consultas, especialmente con JOINS, ya que duplican las columnas y traen mucho que no vas a usar. Es preferible invocar uno a uno los campos a usar. Por eso estoy poniendo la lista de campos en el SELECT, a modo de sugerencia.
2) Para etiquetar el código existen los Highlights en la edición. No pongas "CODE", usa el Highlight correspondiente al código que posteas (PHP, en este caso), de ese modo el contenido se resalta mejor y algunos errores notorios se perciben a simple vista.
3) Poner los dos parámetros buscados (ronda y tornoe), no es una "chapucería", como dices. Es necesario, porque un sólo parámetro, como te hice notar sobre el JOIN, no es suficiente para obtener los datos. En el caso del JOIN, porque diferentes torneos pueden tener iguales números de ronda, con lo que si no pones ambas condiciones terminas haciendo un producto cartesiano parcial... lo que es un espanto.

PD: No he revisado la sintaxis del SQL que te posteo, por lo que puede contener errores.
No hagas Copy+Paste, eso no funciona jamás. Verifica que esté todo bien escrito, y verifica, sobre todo, que el SQL quede bien armado, haciendo un echo como ya te he indicado.
Nunca asumas que algo está bien porque crees que está bien o porque lo hizo alguien que conoce más.
Todos cometemos errores (o sino los médicos no tendrían problemas de mala praxis).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)