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

[SOLUCIONADO] ¿Cómo extraer de la BD dos veces en la misma consulta?

Estas en el tema de ¿Cómo extraer de la BD dos veces en la misma consulta? en el foro de Mysql en Foros del Web. Estoy trabajando sobre un panel de administrador. Dicho panel incluye un control sobre usuarios. El control sobre usuarios incluye las siguientes opciones: -Activación/desactivación del usuario. ...
  #1 (permalink)  
Antiguo 18/12/2013, 03:59
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
¿Cómo extraer de la BD dos veces en la misma consulta?

Estoy trabajando sobre un panel de administrador. Dicho panel incluye un control sobre usuarios.

El control sobre usuarios incluye las siguientes opciones:

-Activación/desactivación del usuario.
-Acceso al historial de actividad del usuario.

En esta última opción, tengo que extraer los datos de 4 tablas, estas tablas son:

*users(id_user|id_twitter|name|screen_name|image|p oints)

*answers (id_answer|answer|id_questions->question.id_question|id_users->users.id_user|id_friend->users.id_twitter|datetime|statement).

*questions (id_question|question|id_typequestions->typequestions.id_typequestion).

*typequestions(id_typequestion|typequestion).

De manera que en la tabla answers id_users es el id_user del usuario que realiza una pregunta sobre un amigo y el id_friend es el usuario sobre el que se realiza la pregunta.

Con la siguiente consulta obtengo casi todos los datos que necesito, excepto el nombre del usuario sobre el que se realiza la pregunta, solo obtengo el nombre del que realiza la pregunta:

Código SQL:
Ver original
  1. /*en el where, 14 sería un entero pasado por PHP*/
  2.  
  3. SELECT * FROM answers A
  4.                         INNER JOIN questions Q
  5.                             ON A.id_questions=Q.id_question
  6.                         JOIN typequestions TQ
  7.                             ON Q.id_typequestions=TQ.id_typequestion
  8.                         INNER JOIN users U
  9.                             ON A.id_users=U.id_user
  10.                         WHERE A.id_users=14 OR A.id_friend=ANY(SELECT id_twitter FROM users WHERE id_user=14);

He pensado en cómo podría hacer esto con subconsultas, pero no veo que eso sea posible.

¿Alguien me da ideas de cómo podría hacerlo? no es necesario aportar código, solo ideas :D
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 18/12/2013, 06:22
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

Código MySQL:
Ver original
  1. SELECT * FROM answers A
  2.                         INNER JOIN questions Q
  3.                             ON A.id_questions=Q.id_question
  4.                         JOIN typequestions TQ
  5.                             ON Q.id_typequestions=TQ.id_typequestion
  6.                         INNER JOIN users U   -- <---- Aqui consigues el que pregunta
  7.                             ON A.id_users=U.id_user
  8.                         INNER JOIN users U2   -- <---- Aqui consigues sobre el que se pregunta
  9.                             ON A.id_friend=U2.id_user
  10.                        WHERE A.id_users=14 OR A.id_friend=ANY(SELECT id_twitter FROM users WHERE id_user=14);

Puedes poner tantas veces como quieras o necesites una tabla solo le tines que poner alias distintos y claro si quieres que den otra información relacionarlas de forma distinta.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 18/12/2013, 07:05
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

Muchas gracias por tu ayuda qumfv.

Supongo que en el último on quisistes poner U2.id_twitter en vez de U2.id_user puesto que esa sería la correcta equivalencia entre ambos campos de ambas tablas.

El problema con esa consulta, que la he probado, es que me devolvería el name del usuario sobre el que se realiza la pregunta pero no el name de quien contesta.

He probado esta consulta hace unos segundos

Código SQL:
Ver original
  1. SELECT answers.* AS A, questions.* AS Q, typequestions.* AS TQ, users.* AS U, users.* AS US FROM answers
  2.                         INNER JOIN questions Q
  3.                             ON A.id_questions=Q.id_question
  4.                         JOIN typequestions TQ
  5.                             ON Q.id_typequestions=TQ.id_typequestion
  6.                         INNER JOIN users U
  7.                             ON A.id_users=U.id_user
  8.                         INNER JOIN users US
  9.                             ON A.id_friend=US.id_twitter
  10.                         WHERE A.id_users=14 OR A.id_friend=ANY(SELECT id_twitter FROM users WHERE id_user=14)

con la intención de que separara los resultados con referencias distintas pero me da el siguiente error

Cita:
Unknown table 'questions'
evidentemente la tabla questions existe en la BD :S
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 18/12/2013, 07:10
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

Cita:
evidentemente la tabla questions existe en la BD :S
Si pero le has puesto Q de alias luego ya no existe dentro de la query como questions....

Código MySQL:
Ver original
  1. SELECT * FROM answers A
  2.                         INNER JOIN questions Q
  3.                             ON A.id_questions=Q.id_question
  4.                         JOIN typequestions TQ
  5.                             ON Q.id_typequestions=TQ.id_typequestion
  6.                         INNER JOIN users U
  7.                             ON A.id_users=U.id_user
  8.                         INNER JOIN users US
  9.                             ON A.id_friend=US.id_twitter
  10.                         WHERE A.id_users=14 OR A.id_friend=ANY(SELECT id_twitter FROM users WHERE id_user=14)

A.id_users es el id del que pregunta o del que responde? Luego consigues su nombre.
A.id_friend es el id de sobre quien se pregunta...? Idem....

Cita:
El problema con esa consulta, que la he probado, es que me devolvería el name del usuario sobre el que se realiza la pregunta pero no el name de quien contesta.
Coge la idea debes relacionar la tabla users con los id de usuario que tengas en las answers....o questions....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 18/12/2013 a las 07:18
  #5 (permalink)  
Antiguo 18/12/2013, 07:15
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

entonces ¿debería especificar cada columna de cada tabla que quiero extraer y con users cambiar cada alias?
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 18/12/2013, 07:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

Cita:
Iniciado por guardarmicorreo Ver Mensaje
entonces ¿debería especificar cada columna de cada tabla que quiero extraer y con users cambiar cada alias?
Si o usar un solo * y obtenerlos todos....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #7 (permalink)  
Antiguo 18/12/2013, 07:21
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

eso en el SELECT pero ¿en los inner join creo nuevos alias o utilizo los creados en el select?
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 18/12/2013, 07:22
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: ¿Cómo extraer de la BD dos veces en la misma consulta?

El problema de usar el asterisco, es que a nivel programático, te de volverá una tabla resultado con identificadores repetidos. A diferencia de otros DBMS y algunas interfases, MySQL no modifica los nombres de las columnas resultado si estos se repiten.
Es preferible tomarse el tiempo y especificar una a una las columnas. Además, el uso del asterisco te traerá datos inútiles, atentando contra la performance.
No es buena práctica.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 18/12/2013, 07:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

Totalmente deacuerdo con nuestro moderador*.

Cita:
Iniciado por guardarmicorreo Ver Mensaje
eso en el SELECT pero ¿en los inner join creo nuevos alias o utilizo los creados en el select?
Los alias los creas en el FROM quando eliges tablas y los usas siempre que tengas que referirte a un campo de esa tabla, sea en el select, (JOIN...) ON, WHERE, GROUP BY....

Edito: *criollo
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #10 (permalink)  
Antiguo 18/12/2013, 07:56
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

Muchas gracias a ambos por vuestra ayuda.

He probado la siguiente consulta

Código SQL:
Ver original
  1. SELECT A.id_answer, A.answer, A.id_questions,
  2.                                     A.id_users, A.id_friend, A.datetime,
  3.                                     A.statement,
  4.                                     Q.id_question, Q.question, Q.id_typequestions,
  5.                                     TQ.id_typequestion, TQ.typequestion,
  6.                                     U.id_user AS Uid, U.id_twitter AS Uidtw, U.name AS Un,
  7.                                     U.screen_name AS Uscr, U.image AS Uimg,
  8.                                     US.id_twitter AS USidtw, US.name AS USn, US.image AS USimg
  9.                                    
  10.                         FROM answers AS A, questions AS Q, typequestions AS TQ, users AS U, users AS US
  11.                         INNER JOIN Q
  12.                             ON A.id_questions=Q.id_question
  13.                         JOIN  TQ
  14.                             ON Q.id_typequestions=TQ.id_typequestion
  15.                         INNER JOIN  U
  16.                             ON A.id_users=U.id_user
  17.                         INNER JOIN  US
  18.                             ON A.id_friend=US.id_twitter
  19.                         WHERE A.id_users=14 OR A.id_friend=ANY(SELECT id_twitter FROM users WHERE id_user=14)

Pero me devuelve un error

Cita:
Not unique table/alias: 'Q'
No lo entiendo, solamente tengo declarada una vez el alias Q :S
__________________
Ayúdame a hacerlo por mi mismo.
  #11 (permalink)  
Antiguo 18/12/2013, 08:11
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: ¿Cómo extraer de la BD dos veces en la misma consulta?

Estás escribiendo mal la sentencia. Si usas INNER JOIN, la sintaxis es así:
Código MySQL:
Ver original
  1.     A.id_answer,
  2.     A.answer,
  3.     A.id_questions,
  4.     A.id_users,
  5.     A.id_friend,
  6.     A.datetime,
  7.     A.statement,
  8.     Q.id_question,
  9.     Q.question,
  10.     Q.id_typequestions,
  11.     TQ.id_typequestion,
  12.     TQ.typequestion,
  13.     U.id_user Uid,
  14.     U.id_twitter Uidtw,
  15.     U.name Un,
  16.     U.screen_name Uscr,
  17.     U.image Uimg,
  18.     US.id_twitter USidtw,
  19.     US.name USn,
  20.     US.image USimg
  21.     answers A
  22.     INNER JOIN questions Q ON A.id_questions=Q.id_question
  23.     INNER JOIN  typequestions TQ ON Q.id_typequestions=TQ.id_typequestion
  24.     INNER JOIN  users U ON A.id_users=U.id_user
  25.     INNER JOIN  users US ON A.id_friend=US.id_twitter
  26.     A.id_users=14 OR
  27.     A.id_friend=ANY(SELECT id_twitter FROM users WHERE id_user=14)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 18/12/2013, 08:21
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

Ahhhh ahora creo que lo entiendo, ¿resulta que FROM engloba a JOIN, es así?

Sobre la caligrafía ¿es mejor especificar cada columna en cada línea y no agruparlos de a tres no?

Muchas gracias por vuestras ayudas! :D (me gustó mucho tu caligrafía gnzsoloyo :D )

Edito: la consulta funcionó perfectamente.

¿Me recomendaríais hacerlo de otra manera?
__________________
Ayúdame a hacerlo por mi mismo.
  #13 (permalink)  
Antiguo 18/12/2013, 08:28
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: ¿Cómo extraer de la BD dos veces en la misma consulta?

Lo de encolumnar el código como lo hice es muy habitual con algunas herramientas de desarrollo, como por ejemplo el MySQL Worbench, al usar el plugin que reformatea códigos. Te recomiendo usar esa herramienta para pruebas porque es nativa y bastante eficiente.
Personalmente, lo hago así para verificar mejor que no haya duplicidades de columnas, alias ni errores de separadores (comas) u otros elementos que rompan la sintaxis.
Incluso cuando traslado el codigo a la aplicación suelo cargar las variables programadas de modo que en el script siga viendose escrito así. Ayuda a analizar fallos en la programación.
En cuanto a tu consulta, no me termina de convencer el ANY del WHERE, pero tendría que hacer algunas pruebas para decirte algo concreto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 18/12/2013, 08:36
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: ¿Cómo extraer de la BD dos veces en la misma consulta?

perfecto, cualquier recomendación sobre otra manera mejor de hacerlo la leeré encantado :D :P

Edito:

La finalidad de la subconsulta en el WHERE es que también obtenga de la tabla respuestas las respuestas sobre el usuario, así obtengo las preguntas que ha realizado pero también lo que han contestado sobre él.
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: bd, join, php, select, tabla, usuarios, veces
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 13:59.