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

[SOLUCIONADO] seleccion de dos tablas con inner join

Estas en el tema de seleccion de dos tablas con inner join en el foro de Mysql en Foros del Web. Quiero obtener los datos de una tabla. En dicha tabla hay varias foreign key que apuntan a diferentes tablas. Quiero obtener los esos datos en ...
  #1 (permalink)  
Antiguo 25/11/2013, 08:18
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
seleccion de dos tablas con inner join

Quiero obtener los datos de una tabla. En dicha tabla hay varias foreign key que apuntan a diferentes tablas. Quiero obtener los esos datos en las otras tablas y no solo el id de las tablas padres.

Quier hacerlo todo en una sola consulta.

Código SQL:
Ver original
  1. SELECT * FROM answers, questions
  2.                                 INNER JOIN questions
  3.                                     ON answers.id_questions=questions.id_question
  4.                                 INNER JOIN users
  5.                                     ON answers.id_users=users.id_user
  6.                                 INNER JOIN typequestions
  7.                                     ON questions.id_typequestions=typequestions.id_typequestion
  8.                             WHERE answers.id_friend=54321
  9.                             ORDER BY id_answer DESC

Pero me da el siguiente error

Cita:
Not unique table/alias: 'questions'
¿Alguien puede explicarme por qué y cómo podría solucionarlo?
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 25/11/2013, 08:55
Avatar de 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
Puntos: 2658
Respuesta: seleccion de dos tablas con inner join

Pues mira:
Código MySQL:
Ver original
  1. FROM answers, questions
  2.       INNER JOIN questions ON answers.id_questions=questions.id_question
  3.       INNER JOIN users ON answers.id_users=users.id_user
  4.       INNER JOIN typequestions ON questions.id_typequestions=typequestions.id_typequestion
  5. WHERE answers.id_friend=54321
  6. ORDER BY id_answer DESC
¿Ves que estás llamando dos veces a la tabla "questions", siempre con el mismo nombre?
Bueno, ese es el problema.

¿Cómo se soluciona?

Con ALIAS. Para eso se usan.
Aunque en realidad me parece que tu caso es más bien que pusiste una tabla de más...

Por otro lado, estás mezclando JOINs implícitos on explícitos, lo que puede dar lugar a respuestas erróneas.Si usas INNER JOIN , usa INNER JOIN en TODAS LAS TABLAS. Siempre.

Código MySQL:
Ver original
  1. FROM answers A
  2.       INNER JOIN questions Q ON A.id_questions = Q.id_question
  3.       INNER JOIN users U ON A.id_users = U.id_user
  4.       INNER JOIN typequestions TQ ON  Q.id_typequestions = TQ.id_typequestion
  5. WHERE A.id_friend=54321
  6. ORDER BY A.id_answer DESC
Consejo: acostúmbrate a usar alias. Evitan tener "codigos chorizo" ilegibles.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 25/11/2013, 08:58
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: seleccion de dos tablas con inner join

Hola guardarmicorreo:

El problema es que estás combinando dos maneras de hacer JOINS... por un lado estás listando la tabla questions en el FROM separado por comas y después estás haciendo un INNER JOIN sobre la misma tabla:

Código:
SELECT * FROM answers, questions
                                INNER JOIN questions
                                    ON answers.id_questions=questions.id_question
                                INNER JOIN users
                                    ON answers.id_users=users.id_user
                                INNER JOIN typequestions
                                    ON questions.id_typequestions=typequestions.id_typequestion
                            WHERE answers.id_friend=54321
                            ORDER BY id_answer DESC
Quita la tabla que está en el FROM, es mejor siempre utilizar JOIN's....

Código MySQL:
Ver original
  1. SELECT * FROM answers
  2.    questions ON answers.id_questions = questions.id_question
  3.    users  ON answers.id_users = users.id_user
  4.    typequestions ON questions.id_typequestions = typequestions.id_typequestion
  5. WHERE answers.id_friend = 54321
  6. ORDER BY id_answer DESC

y finalmente un recomendación... no utilices un SELECT *, esto es una pésima costumbre que tienen muchos programadores sólo por no querer escribir código... lista siempre los campos que vas a utilizas, NO IMPORTA SI SON MUCHOS, O INCLUSO SI SON TODOS.

Saludos
Leo.

Cita:
EDITADO: Siempre un paso detrás de gnzsoloyo jejejejejeje, saludos
  #4 (permalink)  
Antiguo 25/11/2013, 09:01
Avatar de 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
Puntos: 2658
Respuesta: seleccion de dos tablas con inner join

No siempre.... Más de una vez posteas antes que yo.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/11/2013, 09:15
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: seleccion de dos tablas con inner join

jajajajaja siempre codo con codo los dos, sois unos máquinas :D

Muchas gracias por haberme aclarado el concepto sobre el problema y los consejos!!
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: join, seleccion, select, 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 11:22.