Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Armar consulta con dos tablas y foreing key para mostrar datos

Estas en el tema de Armar consulta con dos tablas y foreing key para mostrar datos en el foro de Mysql en Foros del Web. El nombre la verdad no se me ocurrió bien, pero lo que quiero es mostrar una grilla de partidos por ejemplo Fecha 1 - REAL ...
  #1 (permalink)  
Antiguo 20/03/2013, 14:26
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 16 años
Puntos: 175
Armar consulta con dos tablas y foreing key para mostrar datos

El nombre la verdad no se me ocurrió bien, pero lo que quiero es mostrar una grilla de partidos por ejemplo

Fecha 1 - REAL MADRID vs BAYERN MUNICH

para eso tengo 3 tablas.. una de jornada, otra de equipos y una tercera donde se almacenan los emparejamientos.. mi problema es el siguiente y no se como resolverlo... muestro la estructura de mi tabla

ES SOLO ESTRUCTURA
Código PHP:
 ####################################3
 
TABLA EQUIPOS
 
####################################
 
id_equipo    |    equipo
 
-------------------------------------    
 
1            |    AC MILAN
 2            
|     REAL MADRID
 3            
|    BARCELONA
 4            
|    BAYERN MUNICH
 
 
 
 
####################################3
 
TABLA JORNADAS
 
####################################
 
id_jornada    |    jornada
 
-------------------------------------
 
1            |    Fecha 1
 2            
|    Fecha 2
 3            
|    Fecha 3
 
 
 
####################################3
 
TABLA PARTIDOS
 
####################################
 
id_partido    |    id_jornada    |    equipo1    |    equipo2
 1            
|    1            |    1        |    4
 2            
|    1            |    3        |    2
 3            
|    2            |    3        |    1
 4            
|    2            |    2        |    
Si se fijan en la tabla de partido, en EQUIPO1 y EQUIPO2 se guardan dos números, cada numero corresponde a un id_equipo de la tabla EQUIPOS.

id_jornada es tambien un foreing key de la tabla JORNADAS

Lo único que necesito es traer los resultados como dije al principio

Fecha 1
REAL MADRID vs BAYERN MUNICH
BARCELONA vs AC MILAN

y asi según se halla emparejado... no soy un astro en esto del SQL (mysql para php) pero hice algo como.

Código PHP:

SELECT j
.jornadae.equipop.*
FROM jornadas AS jequipos AS epartidos AS p
WHERE j
.id_jornada=p.id_jornada
AND j.id_jornada=
Me traer genial los datos de PARTIDOS, pero necesito imprimir los nombres de los equipos y no se como hacer esa parte de la consulta... agradecería una mano.
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #2 (permalink)  
Antiguo 20/03/2013, 15:05
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Armar consulta con dos tablas y foreing key para mostrar datos

Hola loncho_rojas:

Este tipo de consultas la hemos tratado infinidad de veces en el foro, te recomiendo que cuando tengas alguna duda te tomes un momento para utilizar la herramienta de búsqueda para ver si hay algo publicado que te pueda servir, o que le preguntes a San GOOGLE, el generalmente tiene la respuesta a muchas de las preguntas de los foristas.

Al tener una doble referencia hacia una misma tabla, lo que debes hacer es un doble JOIN, utilizando un alias distinto para cada caso, sería así:

Código MySQL:
Ver original
  1. mysql> SELECT j.jornada, e1.equipo, e2.equipo
  2.     -> FROM partidos p
  3.     -> INNER JOIN equipos e1 ON e1.id_equipo = p.equipo1
  4.     -> INNER JOIN equipos e2 ON e2.id_equipo = p.equipo2
  5.     -> INNER JOIN jornadas j ON j.id_jornada = p.id_jornada
  6.     -> WHERE p.id_jornada = 1;
  7.  
  8. +---------+-----------+---------------+
  9. | jornada | equipo    | equipo        |
  10. +---------+-----------+---------------+
  11. | Fecha 1 | BARCELONA | REAL MADRID   |
  12. | Fecha 1 | AC MILAN  | BAYERN MUNICH |
  13. +---------+-----------+---------------+
  14. 2 rows in set (1.21 sec)

En cuanto a tu consulta, cabría hacer algunas recomendaciones:

1. La palabra reservada "AS" es completamente obsoleta, de hecho ya no es recomendada dentro de las mejores prácticas de SQL.

2. Evita hacer las uniones entre las tablas en el FROM-WHERE, en lugar de eso utiliza los JOIN's (LEFT, RIGTH, INNER según corresponda), si tienes dudas de como trabajan preguntale a Santa Wikipedia

En lugar de hacer esto:

Código:
FROM tabla1, tabla2 WHERE tabla1.campo = tabla2.campo 

Has esto:

FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
En tu ejemplo sólo estás haciendo la unión entre tus tablas jornadas y partidos, pero también incluyes la tabla de equipos, por lo tanto se realiza un PRODUCTO CARTESIANO entre tus tablas.

El uso de los JOIN's además de ser más eficiente te ayuda a evitar justamente este tipo de errores.

3. Finalmente, dices que el resultado debería ser

REAL MADRID vs BAYERN MUNICH
BARCELONA vs AC MILAN

Pero observa los datos, para la fecha 1 juegan Real Madrid VS Barcelona, ese es un problema con los datos...

Saludos
Leo.
  #3 (permalink)  
Antiguo 20/03/2013, 16:12
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 16 años
Puntos: 175
Respuesta: Armar consulta con dos tablas y foreing key para mostrar datos

Gracias, ahora si... hice lo mismo con los WHERE pero solo me traia un equipo... por lo de los datos es solo un ejemplo gráfico... lo del alias AS la verdad no lo manejaba, gracias por el dato =D
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...

Etiquetas: armar, key, php, select, sql, tabla, tablas
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 18:28.