Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Consulta datos a tres tablas da resultado repetido

Estas en el tema de Consulta datos a tres tablas da resultado repetido en el foro de PHP en Foros del Web. Hola. He leído otro tema que aparentemente al compañero le pasaba esto, pero su error, si no recuerdo mal, estaba en cómo presentaba los datos, ...
  #1 (permalink)  
Antiguo 18/11/2014, 16:12
 
Fecha de Ingreso: noviembre-2014
Ubicación: Madrid
Mensajes: 81
Antigüedad: 9 años, 5 meses
Puntos: 1
Consulta datos a tres tablas da resultado repetido

Hola.
He leído otro tema que aparentemente al compañero le pasaba esto, pero su error, si no recuerdo mal, estaba en cómo presentaba los datos, no en cómo los conseguía. Creo haber entendido eso.

La cuestión es que tengo 3 tablas enlazadas por sus ids. Y quiero hacer una consulta que me saque datos de ellas.
El resultado: es correcto pero se repite tantas veces como filas tiene la tabla.
La estructura es:
t1 tiene su propio identificador y los identificadores de las otras dos. Digamos que es la tabla que sirve de unión.
El código es:
Código:
$consulta="SELECT t2.Nombre FROM t1 INNER JOIN t2 ON t1.Identificador_t2=t2.Id
INNER JOIN t3 ON t1.Identificador_t3='$dato_venido_POST'";
El dato venido del formulario es el identificador de la tabla3.
La idea es:
Tengo en la tabla 3 un dato. Dame los datos de la tabla 2 que corresponden a ese dato. Lo encontrarás en la tabla 1.
Espero haberme explicado.
Y por si acaso tuviera mal la forma de enseñarlos, el código
Código:
$resultado=mysql_query($consulta) or die (mysql_error()); 
     echo "<table>";  
     echo "<tr>";  
     echo "<th>Identificador</th>";  
     echo "</tr>";  
     while ($row = mysql_fetch_row($resultado)){  
         echo "<tr>";  
         echo "<td>$row[0]</td>";  
         echo "</tr>";  
     }  
     echo "</table>";
No veo por qué me repite tantas veces como filas tiene la tabla t2.
Agradecido de antemano
  #2 (permalink)  
Antiguo 18/11/2014, 18:39
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Consulta datos a tres tablas da resultado repetido

Eso es porque estas haciendo un producto cartesiano.

En las condiciones del ON solo deben ir las relaciones entre tablas, en muy raros casos es necesario agregar otro tipo de condiciones alli, no obstante es posible.

En tu caso tendrías que hacer algo asi:
Código MySQL:
Ver original
  1.     t2.Nombre
  2.     t1
  3.     INNER JOIN t2 ON t1.Identificador_t2=t2.Id
  4.     INNER JOIN t3 ON t1.Identificador_t3=t3.Id
  5.     t1.Identificador_t3='$dato_venido_POST'

o eventualmente tambien podrias decir:
Código MySQL:
Ver original
  1.     t2.Nombre
  2.     t1
  3.     INNER JOIN t2 ON t1.Identificador_t2=t2.Id
  4.     INNER JOIN t3 ON (t1.Identificador_t3=t3.Id AND t3.Id='$dato_venido_POST')

si bien son equivalentes lo que cambia es la forma en que el motor las optimiza, ambas retornan lo mismo, pero con un volumen grande de resultados una correra mas rapido que la otra.

Lo importante es que recuerdes que SI O SI en el ON deben ir las relaciones entre tablas, luego las condiciones puedes ponerlas en el WHERE o en el caso de la segunda consulta, tambien en el ON pero vinculado de forma logica con la relacion entre las tablas.

Otra forma menos prolija de solventar tu problema es mediante el uso de DISTINCT:
Código MySQL:
Ver original
  1.     t2.Nombre
  2.     t1
  3.     INNER JOIN t2 ON t1.Identificador_t2=t2.Id
  4.     INNER JOIN t3 ON t1.Identificador_t3='$dato_venido_POST'

pero esa forma no te la recomiendo, si otra persona tiene que mantener ese codigo en el futuro te odiara.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 19/11/2014, 05:44
 
Fecha de Ingreso: noviembre-2014
Ubicación: Madrid
Mensajes: 81
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Consulta datos a tres tablas da resultado repetido

No puedes tener más razón. Después de horas probando el código ya estaba en estado de empanada mental y el where se quedó por el camino.
Tu respuesta no sólo ha sido válida sino también muy bien desarrollada. Muchas gracias.

Etiquetas: formulario, mysql, repetido, resultado, select, sql, tabla, tablas, tres
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 01:22.