Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema con INNER JOIN

Estas en el tema de Problema con INNER JOIN en el foro de PHP en Foros del Web. Hola, he realizado una búsqueda por el foro, pero no logro arreglar el fallo que tengo en esta sentencia SQL: Pretendo sacar como resultado de ...
  #1 (permalink)  
Antiguo 20/05/2013, 16:28
dankko
Invitado
 
Mensajes: n/a
Puntos:
Problema con INNER JOIN

Hola, he realizado una búsqueda por el foro, pero no logro arreglar el fallo que tengo en esta sentencia SQL:

Pretendo sacar como resultado de estas cuatro tablas:

Código:
torneos
(
id_torneo
nombre_torneo
)

torneos_rondas
(
id_ronda
nombre_ronda
)

torneos_inscripcion
(
user_id
username
id_torneo
)

torneos_enfrentamientos
(
id_enfrentamiento
id_ronda
user_id_1
user_id_2
id_torneo
)
Resultado:

Enfrentamiento ronda 1

Usuario 1 - Usuario 2

(donde torneos_enfrentamientos.user_id_1 = torneos_inscripcion.user_id y donde torneos_enfrentamientos.user_id_2 = torneos.inscripcion.user_id)

La consulta que estoy sacando es esta:

Código:
$ssql = "SELECT username, id_enfrntamiento,id_ronda FROM torneos_enfrentamientos
	INNER JOIN torneos_inscripcion ON torneos_inscripcion.user_id = torneos_enfrentamientos.user_id_1 
ON torneos_rondas.id_ronda = torneos_enfrentamientos.id_ronda
	where torneos_enfrentamientos.id_torneo = '$id_torneo'";
Pero tengo algún error, ya que no logro sacar el resultado...
  #2 (permalink)  
Antiguo 20/05/2013, 17:14
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problema con INNER JOIN

En tu select tienes id_enfrntamiento, creo que falta una e

Además, cuando una consulta no te funciona, siempre es bueno saber porqué; supongamos que estás usando la vieja y obsoleta librería mysql:

Código PHP:
Ver original
  1. $consulta = '/* Aquí tu consulta */';
  2. $resultado = mysql_query($consulta) or die('Error en consulta: ' . mysql_error());

Con eso debes obtener un mensaje de error muy explicativo. Si no, entonces imprime la consulta y pruébala en PhpMyAdmin, ahí podrás ir afinando detalles hasta tenerla funcionado correctamente.

Agrego: También tienes un ON sin JOIN previo en la tercera línea de la consulta.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 21/05/2013, 03:46
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Hola Triby, gracias por responder...

Código:
$ssql = "SELECT username, id_enfrentamiento,id_ronda FROM torneos_enfrentamientos
	INNER JOIN torneos_inscripcion ON torneos_inscripcion.user_id = torneos_enfrentamientos.user_id_1 
	INNER JOIN torneos_inscripcion ON torneos_inscripcion.user_id = torneos_enfrentamientos.user_id_2
	INNER JOIN torneos_rondas ON torneos_rondas.id_ronda = torneos_enfrentamientos.id_ronda
	where torneos_enfrentamientos.id_torneo = '$id_torneo'";
El error que me produce es el siguiente:

[phpBB Debug] PHP Warning: in file C:/wamp/www/.../torneo-rondas.php on line 21: mysql_num_rows() expects parameter 1 to be resource, boolean given
  #4 (permalink)  
Antiguo 21/05/2013, 14:37
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Pongo la sentencia completa para veais donde se encuentra el error... Me lo marca en la parte en al que le digo que si no hay resultados mostrar una notificacion, pero seguramente esté en la consulta:

Código:
$conexion = conecta_base_datos();
$id_torneo = (isset($_GET["id"])) ? $_GET["id"] : exit();
$ssql = "SELECT * FROM torneos_enfrentamientos
	INNER JOIN torneos_inscripcion ON torneos_inscripcion.user_id = torneos_enfrentamientos.user_id_1
	INNER JOIN torneos_rondas ON torneos_rondas.id_ronda = torneos_enfrentamientos.id_ronda		
	where torneos_enfrentamientos.id_torneo = '$id_torneo'";			
$rs = mysql_query($ssql);
if(mysql_num_rows($rs)> 0){
while ($fila = mysql_fetch_array($rs)){

echo 'partido nº ' . $fila["id_partido"] . '<br>';

echo '<a href="' . $fila["user_id_1"] . '">' . $fila["username"] . '</a>';
	echo ' - ';
echo '<a href="' . $fila["user_id_2"] . '">' . $fila["username"] . '</a><br>';

	
}
}else{
    //es que no se encontraron anuncios
    echo'<div class="alert alert-error">Aún no se han generado las rondas del torneo.</div>';
}
  #5 (permalink)  
Antiguo 21/05/2013, 16:48
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problema con INNER JOIN

Si agregas la parte del or die() que te sugerí, ahí vas a ver el mensaje de error originado por la consulta.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 21/05/2013, 20:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN

Separando la consulta que usas (y simplificándola un poco con uso de alias):
Código MySQL:
Ver original
  1.     *
  2.     `torneos_enfrentamientos` TE
  3.         INNER JOIN
  4.     `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  5.         INNER JOIN
  6.     `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  7.     TE.`id_torneo` = '$id_torneo'
No existen errores sintácticos, por lo que si el PHP devuelve ese error es porque o la variable $id_torneo no contiene datos, o no hay registros que cumplan con las relaciones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 22/05/2013, 02:43
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Cita:
Iniciado por Triby Ver Mensaje
En tu select tienes id_enfrntamiento, creo que falta una e

Además, cuando una consulta no te funciona, siempre es bueno saber porqué; supongamos que estás usando la vieja y obsoleta librería mysql:

Código PHP:
Ver original
  1. $consulta = '/* Aquí tu consulta */';
  2. $resultado = mysql_query($consulta) or die('Error en consulta: ' . mysql_error());

Con eso debes obtener un mensaje de error muy explicativo. Si no, entonces imprime la consulta y pruébala en PhpMyAdmin, ahí podrás ir afinando detalles hasta tenerla funcionado correctamente.

Agrego: También tienes un ON sin JOIN previo en la tercera línea de la consulta.
Perdón! estaba seguro de la que la tenía puesta, pero de todas formas está devolviendo el error porque no encuentra resultados...

Pero me parece raro porque

Le estoy pasando a través de $_GET[id] el ID del torneo y le doy el valor del GET a la variable $id_torneo.
  #8 (permalink)  
Antiguo 22/05/2013, 02:50
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Separando la consulta que usas (y simplificándola un poco con uso de alias):
Código MySQL:
Ver original
  1.     *
  2.     `torneos_enfrentamientos` TE
  3.         INNER JOIN
  4.     `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  5.         INNER JOIN
  6.     `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  7.     TE.`id_torneo` = '$id_torneo'
No existen errores sintácticos, por lo que si el PHP devuelve ese error es porque o la variable $id_torneo no contiene datos, o no hay registros que cumplan con las relaciones.
Lo raro es que si que hay registros que cumplen los requisitos:

Tabla torneos_enfrentamientos:
Código:
id_enfrentamiento | id_torneo | id_ronda | user_id_1 | user_id_2 | enfrentamiento_jugado
2 	7 	1 	63 	2 	NO 
3 	7 	1 	63 	2 	NO 
4 	7 	2 	2 	63 	NO
Y esto es lo que le pasa través de la URL, el ID del torneo, que es a lo que llamo con la variable $id_torneo: http://www.../torneo-rondas.php?id=7

Además, de como podría hacer para poder sacar el username correspondiente a user_id_1 y el username correspondiente a user_id_2, ya que al hacer INNER JOIN torneos_enfrentamientos ON torneos_enfrentamientos.user_id_1 = torneos_inscripcion.user_id, lo que está haciendo es darle el mismo nombre tanto a user_id_1 y a user_id_2.
  #9 (permalink)  
Antiguo 23/05/2013, 15:46
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Alguna idea?
  #10 (permalink)  
Antiguo 23/05/2013, 17:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN

Cita:
Iniciado por dankko Ver Mensaje
Lo raro es que si que hay registros que cumplen los requisitos:

Tabla torneos_enfrentamientos:
Código:
id_enfrentamiento | id_torneo | id_ronda | user_id_1 | user_id_2 | enfrentamiento_jugado
2 	7 	1 	63 	2 	NO 
3 	7 	1 	63 	2 	NO 
4 	7 	2 	2 	63 	NO
Y esto es lo que le pasa través de la URL, el ID del torneo, que es a lo que llamo con la variable $id_torneo: http://www.../torneo-rondas.php?id=7

Además, de como podría hacer para poder sacar el username correspondiente a user_id_1 y el username correspondiente a user_id_2, ya que al hacer INNER JOIN torneos_enfrentamientos ON torneos_enfrentamientos.user_id_1 = torneos_inscripcion.user_id, lo que está haciendo es darle el mismo nombre tanto a user_id_1 y a user_id_2.
la tabla de muestra resulta insuficiente para saber si las condiciones se cumplen.
Para verificarlo deben cumplirse los dos INNER JOIN al mismo tiempo, además de tener un id_ronda igual al indicado.
Lo que hay que verificar es primero qué es lo que realmente MySQL está recibiendo.
Ponlo de esta forma y pruébalo:
Código PHP:
Ver original
  1. $id_torneo = (isset($_GET["id"])) ? $_GET["id"] : exit();
  2. $ssql = "SELECT *
  3. FROM `torneos_enfrentamientos` TE
  4.        INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  5.        INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  6. WHERE TE.`id_torneo` = $id_torneo";
  7. // verificando la query
  8. echo $ssql;
  9. $rs = mysql_query($ssql);
Luego, si muestra el valor del ID buscado en la consulta, toma la query completa y ejecutala en phpMyadmin.
Una vez hecho, veremos lo que da.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 24/05/2013, 15:36
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Código:
torneos_enfrentamientos

id_enfrentamiento | id_torneo | id_ronda | user_id_1 | user_id_2 | enfrentamiento_jugado
2 	7 	1 	63 	2 	NO 
3 	7 	1 	63 	2 	NO 
4 	7 	2 	2 	63 	NO

torneos_inscripcion

id (de la inscripcion) | user_id | username | nombre_real | email | estado | fecha | id_torneo

	223 	63 	pepito pepito periquito [email protected] 	SP 	2013-05-19 	7
	224 	2 	pepito2 pepit2o periquito2 [email protected] 	SP 	2013-05-19 	7
Te adjunto las dos tablas para ver que puede ser el dato que no esté relacionado.

He probado pero no devuelve nada, devulve el mensaje cuando no hay consultas que cumplan la función... Pero lo que no entiendo es que si hay datos que cumplen todo lo que se indica con INNER JOIN a la vez

En torneos_enfrentamientos > user_id_1, user_id_2 > user_id
En realidad lo que quiero es mostrar el aprtido correspondiente a la ronda con el ID = 1...

Como si se tratará de mostrar un partido de fútbol entre dos equipos
  #12 (permalink)  
Antiguo 24/05/2013, 18:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN

Cita:
Te adjunto las dos tablas para ver que puede ser el dato que no esté relacionado.
Las tablas no me sirven de mucho si no me das el CREATE TABLE que las genera para entender las relaciones.
Además, no me estás dando lo que te pedí: Lo que te muestra cuando pones:

Código PHP:
Ver original
  1. // verificando la query
  2. echo $ssql;
Es una buena costumbre que cuando se te pide una cierta información claramente definida, aportes eso y no otras cosas.
Para que se entienda: Que tu estés seguro de que tu código y los formularios hacen algo, no quiere decir que sea realmente así. TE sorprendería la cantidad de veces que han insistido que todo está bien, y luego con un simple echo se ve que no es lo que creen (o si, pero con condiciones que generan error).

Haz ese echo, y postea lo que muestra en pantalla.
Luego de eso copialo y pruébalo en phpMyadmin, y postea el resultado.

Simplemente para que nosotros estemos seguros.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 25/05/2013, 11:16
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Perdona, te había entendido mal, no había visto lo de hacer un echo al $ssql. Ahora ya se lo que me quieres decir. Lo probaré.

Edit. El archivo php Me devuelve lo siguiente:
Código:
SELECT * FROM `torneos_enfrentamientos` TE INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1` INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` WHERE TE.`id_torneo` = '7'SELECT * FROM `torneos_enfrentamientos` TE INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1` INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` WHERE TE.`id_torneo` = '7'SELECT * FROM `torneos_enfrentamientos` TE INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1` INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` WHERE TE.`id_torneo` = '7'SELECT * FROM `torneos_enfrentamientos` TE INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1` INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` WHERE TE.`id_torneo` = '7'SELECT * FROM `torneos_enfrentamientos` TE INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1` INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` WHERE TE.`id_torneo` = '7'SELECT * FROM `torneos_enfrentamientos` TE INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1` INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` WHERE TE.`id_torneo` = '7'
En phpmyadmin me da el siguiente error del sintaxis:

Código:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM `torneos_enfrentamientos` TE INNER JOIN `torneos_inscripcion` TI ON TI.`u' at line 1

Última edición por dankko; 25/05/2013 a las 11:22
  #14 (permalink)  
Antiguo 25/05/2013, 11:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN



Disculpa la carcajada, pero evidentemente algo estás haciendo mal. Bastante mal.
Te muestro lo que está quedando en tu query, poniéndola más estructuradamente de modo que se vea bien lo que está en ella:
Código MySQL:
Ver original
  1.     FROM `torneos_enfrentamientos` TE
  2.         INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  3.         INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  4.      WHERE TE.`id_torneo` = '7'
  5.  
  6.         SELECT *
  7.         FROM `torneos_enfrentamientos` TE
  8.             INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  9.             INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  10.         WHERE TE.`id_torneo` = '7'
  11.  
  12.             SELECT *
  13.             FROM `torneos_enfrentamientos` TE
  14.                 INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  15.                 INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  16.             WHERE TE.`id_torneo` = '7'
  17.  
  18.                 SELECT *
  19.                 FROM `torneos_enfrentamientos` TE
  20.                     INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  21.                     INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  22.                 WHERE TE.`id_torneo` = '7'
  23.  
  24.                     SELECT *
  25.                    FROM `torneos_enfrentamientos` TE
  26.                         INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  27.                         INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  28.                    WHERE TE.`id_torneo` = '7'
  29.  
  30.                             SELECT * FROM `torneos_enfrentamientos` TE
  31.                             INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  32.                             INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  33.                             WHERE TE.`id_torneo` = '7'

Lo ves más claramente?
¡Esa consulta repite cinco (5) veces la consulta encadenando una detrás de la otra!
Obviamente o hay un loop indebido en alguna parte, o la variable no se está reinicializando donde debe.
La verdadera consulta, descartada toda la basura, es:
Código MySQL:
Ver original
  1. FROM `torneos_enfrentamientos` TE
  2.     INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  3.     INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
  4. WHERE TE.`id_torneo` = '7';
Obviamente no puedo decirte exactamente dónde estas cometiendo el error, porque en el código que no has posteado no hay nada que pueda estar generando este error de construcción de la consulta...
En cualquier caso, para poder seguir con lo que iba diciendo, toma lo que te estoy posteando al final, y prueba ESO en phpMyadmin, a ver qué es lo que la consulta realmente debería devolver.
En cuanto al resto, hay que ver por qué se está generando tal desfasaje. ¿Podrías postear el código completo que usaste para esta prueba?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 26/05/2013, 06:53
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

He cambiado el nombre a la tabla torneos_enfrentamientos por torneos_partidos.
Código:
<?php
$conexion = conecta_base_datos();
$id_torneo = (isset($_GET["id"])) ? $_GET["id"] : exit();

$ssql = "SELECT *
FROM `torneos_partidos` TE
       INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
       INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda`
WHERE TE.`id_torneo` = '$id_torneo'" or die('Error en consulta: ' . mysql_error());			
$rs = mysql_query($ssql);
if(mysql_num_rows($rs)> 0){
while ($fila = mysql_fetch_array($rs)){

    // verificando la query
    echo $ssql;
}
}else{
    //es que no se encontraron anuncios
    echo'<div class="alert alert-error">Aún no se han generado las rondas del torneo.</div>';
}
?>
El resultado de la consulta correcta devuelve lo siguiente:


Última edición por dankko; 26/05/2013 a las 07:00
  #16 (permalink)  
Antiguo 26/05/2013, 07:00
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Te lo adjunto en imagen para que sea más claro.
  #17 (permalink)  
Antiguo 26/05/2013, 07:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN

Bueno, por empezar (ahora no tengo tiempo de verlo más profundamente, luego me pongo a analizar el resultado del query), al menos ya sabemos por qué se replicó la consulta:
¿Me puedes decir por qué pusiste el echo dentro del while?
Si te fijas con cuidado, yo lo puse inmediatamente después de cargar la consula en la variable y antes de enviarla a la base.

En definitiva, ese ha sido un fallo accidental, pero tenlo en cuenta: Las cosas no se ponen en cualquier parte...

Respecto al resultado de la consulta, lo que puedo ver es que te devuelve resultados indebidos o aparentemente duplicado, porque estás filtrando por id_ronda solamente, pero no lo estás haciendo por id_torneo, ni relacionando los torneos, con los que se retornan todas las rondas Nº 7, sin importar a qué torneo pertenecen... y eso no creo que esté bien.

Yo probaría esto:
Código MySQL:
Ver original
  1. FROM `torneos_enfrentamientos` TE
  2.     INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
  3.     INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` AND TR.`id_torneo` = TE.`id_torneo`
  4. WHERE TE.`id_torneo` = '7';
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #18 (permalink)  
Antiguo 26/05/2013, 09:24
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Porque al ver el echo por inercia lo puse debajo del while, donde tenía el resultado de la muestra de partidos.

La forma que uso para relacionarlo con el torneo es darle al valor $id_torneo el valor enviado por get
Código:
$id_torneo = (isset($_GET["id"])) ? $_GET["id"] : exit();
Entonces lo que hace es devolverme las rondas del torneo, los partidos, y los usuarios que están en el torneo con el ID = 7. Pero es la única forma con la que lo relaciono...

He probado con tu consulta pero no me arroja ningún dato. Jugando con dicha consulta he probado a hacer lo siguiente, aunque es un poco chapucilla pero igual puede ayudar en algo o darnos alguna pista:

Código:
<?php
$conexion = conecta_base_datos();
$id_torneo = (isset($_GET["id"])) ? $_GET["id"] : exit();

$ssql = "SELECT * 
FROM `torneos_partidos` TE 
    INNER JOIN `torneos_inscripcion` TI ON TI.`user_id` = TE.`user_id_1`
    INNER JOIN `torneos_rondas` TR ON TR.`id_ronda` = TE.`id_ronda` 
WHERE TE.`id_torneo` = '$id_torneo' and TE. id_ronda = '1'" or die('Error en consulta: ' . mysql_error());			
$rs = mysql_query($ssql);

while ($fila = mysql_fetch_array($rs)){

    // verificando la query
	echo '<a href="' . $fila[user_id_1] . '">' . $fila[username] . '</a>';
	echo ' vs ';
	echo '<a href="' . $fila[user_id_2] . '">' . $fila[username] . '</a><br>';
}

?>
He pensado en hacer varias consultas por ronda, para así sacar el número de partidos que corresponden a cada ronda del torneo indicado por la variable $id_torneo...

El resultado que me ofrece es el siguiente:

Código HTML:
Ver original
  1. dankko2 vs dankko2
  2. dankko2 vs dankko2
  3. dankko2 vs dankko2
  4. dankko2 vs dankko2

Parece que está mostrando un resultado correcto, ya que muestra los cuatro partidos que corresponden a la ronda con el ID=1 que están en el torneo con el ID=7.

Ya te digo, es un poco chapucillas pero igual puede ayudar a descifrar algún error.
  #19 (permalink)  
Antiguo 27/05/2013, 08:50
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

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.

La estructura para esta tabla es simple

Código:
user_id | username |        email                | avatar |
2           dankko         [email protected]      one.jpg
63         dankko2       [email protected]      ...jpg
La relación tambien se hace con la tabla de torneos_inscripciones que llama a user_id y a la tabla partidos, en la que user_id_1 corresponde a al user_id de cada usuario...
  #20 (permalink)  
Antiguo 29/05/2013, 04:15
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Alguna idea?
  #21 (permalink)  
Antiguo 29/05/2013, 05:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 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)
  #22 (permalink)  
Antiguo 29/05/2013, 10:11
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Me refería a chapuza al tener que usar varias llamadas a la consulta pero con diferentes id_ronda y poniendo el nombre de la ronda fuera de la consulta.

He probado con tu consulta, haciendole algunas modificaciones porque tenía algún error:

Código PHP:
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_partido , 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 TR.id_ronda";            
  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.     ?>

La línea que comento estaba repetida y algún campo no era correcto y prefería ordenarlo por las rondas.

De todas formas no me ofrece el resultado correcto, ya que me hace un emparamiento con el resto de usuarios de la tabla de usuarios aunque no estén isncritos en el torneo y repite varias veces el mismo partido:



He probado modificando la consulta a ver si lograba conseguir otro resultado pero sin éxito:

Código PHP:
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_partido , 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_partidos` TP ON TP.`id_partido` = '$id_torneo'"; 
  12.     $ssql .= " WHERE TE.`id_torneo` = '$id_torneo' ";
  13.     $ssql .= " ORDER BY TR.id_ronda";    
  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.     ?>

Debería mostrar dos partidos de la ronda 1 y un partido de la ronda 2.
  #23 (permalink)  
Antiguo 29/05/2013, 10:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN

¿Podrías pasarnos los cREATE TABLE de las tablas y un volcado de datos de muestra para poder realizar unas pruebas?
Código MySQL:
Ver original
  1. SHOW CREATE TABLE `torneos_partidos`;
  2. SHOW CREATE TABLE `torneos_inscripcion`;
  3. SHOW CREATE TABLE `torneos_rondas`;
  4. SHOW CREATE TABLE `usuarios`;
  5. SHOW CREATE TABLE `torneos_partidos`;

Para el volcado de datos podrías usar el phpMyadmin.

Se hace muy difícil darte la solución correcta del problema de SQL sin tener elementos reales.
Además, sería conveniente seguir este tema en el foro de MySQL, ya que el problema es ajeno a PHP. Es más tema de bases de datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #24 (permalink)  
Antiguo 30/05/2013, 03:01
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Okey.


Volcado

torneos_partidos:

Código SQL:
Ver original
  1. CREATE TABLE `torneos_partidos` (
  2.  `id_partido` INT(7) NOT NULL AUTO_INCREMENT,
  3.  `id_torneo` INT(7) NOT NULL,
  4.  `id_ronda` INT(7) NOT NULL,
  5.  `user_id_1` INT(7) NOT NULL,
  6.  `user_id_2` INT(7) NOT NULL,
  7.  `partido_jugado` VARCHAR(250) NOT NULL DEFAULT 'NO',
  8.  `ganador` INT(4) NOT NULL DEFAULT '0',
  9.  PRIMARY KEY (`id_partido`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

usuarios:

Código SQL:
Ver original
  1. CREATE TABLE `foro_users` (
  2.  `user_id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.  `user_type` tinyint(2) NOT NULL DEFAULT '0',
  4.  `group_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '3',
  5.  `user_permissions` mediumtext COLLATE utf8_bin NOT NULL,
  6.  `user_perm_from` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  7.  `user_ip` VARCHAR(40) COLLATE utf8_bin NOT NULL DEFAULT '',
  8.  `user_regdate` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  9.  `username` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  10.  `username_clean` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  11.  `name1` VARCHAR(35) COLLATE utf8_bin NOT NULL,
  12.  `name2` VARCHAR(35) COLLATE utf8_bin NOT NULL,
  13.  `team_id` INT(7) NOT NULL,
  14.  `twitter_user` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  15.  `user_password` VARCHAR(40) COLLATE utf8_bin NOT NULL DEFAULT '',
  16.  `user_passchg` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  17.  `user_pass_convert` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  18.  `user_email` VARCHAR(100) COLLATE utf8_bin NOT NULL DEFAULT '',
  19.  `user_email_hash` BIGINT(20) NOT NULL DEFAULT '0',
  20.  `user_birthday` VARCHAR(10) COLLATE utf8_bin NOT NULL DEFAULT '',
  21.  `user_lastvisit` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  22.  `user_lastmark` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  23.  `user_lastpost_time` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  24.  `user_lastpage` VARCHAR(200) COLLATE utf8_bin NOT NULL DEFAULT '',
  25.  `user_last_confirm_key` VARCHAR(10) COLLATE utf8_bin NOT NULL DEFAULT '',
  26.  `user_last_search` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  27.  `user_warnings` tinyint(4) NOT NULL DEFAULT '0',
  28.  `user_last_warning` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  29.  `user_login_attempts` tinyint(4) NOT NULL DEFAULT '0',
  30.  `user_inactive_reason` tinyint(2) NOT NULL DEFAULT '0',
  31.  `user_inactive_time` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  32.  `user_posts` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  33.  `user_lang` VARCHAR(30) COLLATE utf8_bin NOT NULL DEFAULT '',
  34.  `user_timezone` DECIMAL(5,2) NOT NULL DEFAULT '0.00',
  35.  `user_dst` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  36.  `user_dateformat` VARCHAR(30) COLLATE utf8_bin NOT NULL DEFAULT 'd M Y H:i',
  37.  `user_style` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  38.  `user_rank` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  39.  `user_colour` VARCHAR(6) COLLATE utf8_bin NOT NULL DEFAULT '',
  40.  `user_new_privmsg` INT(4) NOT NULL DEFAULT '0',
  41.  `user_unread_privmsg` INT(4) NOT NULL DEFAULT '0',
  42.  `user_last_privmsg` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  43.  `user_message_rules` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  44.  `user_full_folder` INT(11) NOT NULL DEFAULT '-3',
  45.  `user_emailtime` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  46.  `user_topic_show_days` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
  47.  `user_topic_sortby_type` VARCHAR(1) COLLATE utf8_bin NOT NULL DEFAULT 't',
  48.  `user_topic_sortby_dir` VARCHAR(1) COLLATE utf8_bin NOT NULL DEFAULT 'd',
  49.  `user_post_show_days` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
  50.  `user_post_sortby_type` VARCHAR(1) COLLATE utf8_bin NOT NULL DEFAULT 't',
  51.  `user_post_sortby_dir` VARCHAR(1) COLLATE utf8_bin NOT NULL DEFAULT 'a',
  52.  `user_notify` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  53.  `user_notify_pm` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
  54.  `user_notify_type` tinyint(4) NOT NULL DEFAULT '0',
  55.  `user_allow_pm` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
  56.  `user_allow_viewonline` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
  57.  `user_allow_viewemail` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
  58.  `user_allow_massemail` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
  59.  `user_options` INT(11) UNSIGNED NOT NULL DEFAULT '230271',
  60.  `user_avatar` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  61.  `user_avatar_type` tinyint(2) NOT NULL DEFAULT '0',
  62.  `user_avatar_width` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
  63.  `user_avatar_height` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0',
  64.  `user_sig` mediumtext COLLATE utf8_bin NOT NULL,
  65.  `user_sig_bbcode_uid` VARCHAR(8) COLLATE utf8_bin NOT NULL DEFAULT '',
  66.  `user_sig_bbcode_bitfield` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  67.  `user_from` VARCHAR(100) COLLATE utf8_bin NOT NULL DEFAULT '',
  68.  `user_icq` VARCHAR(15) COLLATE utf8_bin NOT NULL DEFAULT '',
  69.  `user_aim` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  70.  `user_yim` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  71.  `user_msnm` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  72.  `user_jabber` VARCHAR(255) COLLATE utf8_bin NOT NULL DEFAULT '',
  73.  `user_website` VARCHAR(200) COLLATE utf8_bin NOT NULL DEFAULT '',
  74.  `user_occ` text COLLATE utf8_bin NOT NULL,
  75.  `user_interests` text COLLATE utf8_bin NOT NULL,
  76.  `user_actkey` VARCHAR(32) COLLATE utf8_bin NOT NULL DEFAULT '',
  77.  `user_newpasswd` VARCHAR(40) COLLATE utf8_bin NOT NULL DEFAULT '',
  78.  `user_form_salt` VARCHAR(32) COLLATE utf8_bin NOT NULL DEFAULT '',
  79.  `user_new` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
  80.  `user_reminded` tinyint(4) NOT NULL DEFAULT '0',
  81.  `user_reminded_time` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  82.  PRIMARY KEY (`user_id`),
  83.  UNIQUE KEY `username_clean` (`username_clean`),
  84.  KEY `user_birthday` (`user_birthday`),
  85.  KEY `user_email_hash` (`user_email_hash`),
  86.  KEY `user_type` (`user_type`)
  87. ) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

torneos_rondas:

Código SQL:
Ver original
  1. CREATE TABLE `torneos_rondas` (
  2.  `id_ronda` INT(7) NOT NULL AUTO_INCREMENT,
  3.  `nombre_ronda` VARCHAR(250) NOT NULL,
  4.  PRIMARY KEY (`id_ronda`)
  5. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1

torneos_inscripcion:

Código SQL:
Ver original
  1. CREATE TABLE `torneos_inscripcion` (
  2.  `id` INT(7) NOT NULL AUTO_INCREMENT,
  3.  `user_id` INT(7) NOT NULL,
  4.  `username` VARCHAR(250) NOT NULL,
  5.  `nombrereal` VARCHAR(100) NOT NULL,
  6.  `apellidos` VARCHAR(250) NOT NULL,
  7.  `email` VARCHAR(250) NOT NULL,
  8.  `estado` VARCHAR(250) NOT NULL DEFAULT 'SP',
  9.  `fecha` DATE NOT NULL,
  10.  `id_torneo` INT(7) NOT NULL,
  11.  PRIMARY KEY (`id`)
  12. ) ENGINE=InnoDB AUTO_INCREMENT=227 DEFAULT CHARSET=latin1


A la tabla de usuarios le tengo de nombre "foro_users"

Última edición por dankko; 30/05/2013 a las 03:07
  #25 (permalink)  
Antiguo 01/06/2013, 06:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 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)
  #26 (permalink)  
Antiguo 05/06/2013, 05:36
dankko
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con INNER JOIN

Me ha funcionado a la perfección con la consulta que me has dejado, sólo he tenido que realizar algún cambio. Eres un genio gnzsoloyo, muchísimas gracias!!
El sistema es un poco manual y sencillo, pero creo que por ahora con esto nos valdrá.

Haré cambios en el sistema de inscripciones para evitar futuros problemas, muchas gracias!
  #27 (permalink)  
Antiguo 05/06/2013, 06:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con INNER JOIN

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #28 (permalink)  
Antiguo 05/06/2013, 09:52
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problema con INNER JOIN

Cita:
Iniciado por dankko
Eres un genio gnzsoloyo, muchísimas gracias!!
No estoy seguro si su paciencia es mayor que su conocimiento, pero, definitivamente, sí es un genio.
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: join, select, sql, 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 11:59.