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

Seleccionar 3 tablas

Estas en el tema de Seleccionar 3 tablas en el foro de Mysql en Foros del Web. Hola señores, Tengo una tarea que hacer y no consigo lograrlo. Os cuento: Tabla miembros: id,... Tabla friendship: id, pide, admite Tabla noticias: id, por, ...
  #1 (permalink)  
Antiguo 13/10/2009, 10:19
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Exclamación Seleccionar 3 tablas

Hola señores,
Tengo una tarea que hacer y no consigo lograrlo. Os cuento:

Tabla miembros:
id,...

Tabla friendship:
id, pide, admite

Tabla noticias:
id, por, titulo...

Necesito asociarlas de esta forma.
La tabla friendship es la tabla de la amistad. Si "juan" es amigo de "pepe", sus respectivas id's aparecerán ahí, haciendo referencia a su id en miembros.
Por tanto, quiero mostrar las NOTICIAS de los amigos de los usuarios, de forma que debe buscar las noticias de los amigos del usuario, buscando pues la id de cada uno en friendship, tened en cuenta que puede estar tanto en pide como admite, asi que habria que hacer algo como (id user = pide && id amigo = admite) OR a la inversa.

Me explico?
La id del usuario lo contiene la variable $iduser.

Gracias de antemano.
  #2 (permalink)  
Antiguo 13/10/2009, 11:16
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Seleccionar 3 tablas

Ya esta resuelto, solo hace falta echarle imaginacion :P

mysql_query("SELECT friendship.* , miembros.*, noticias.* from friendship,miembros,noticias where ( (friendship.admite=$myid && friendship.pide=miembros.id) || (friendship.admite=miembros.id && friendship.pide=$myid) )");

$myid es la id del usuario.
Un saludo.
  #3 (permalink)  
Antiguo 13/10/2009, 11:54
 
Fecha de Ingreso: mayo-2009
Ubicación: Madrid
Mensajes: 62
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Seleccionar 3 tablas

Cita:
Iniciado por filmixt Ver Mensaje
Ya esta resuelto, solo hace falta echarle imaginacion :P
Afortunadamente, la imaginación viene siendo superada por la técnica, y el lenguaje SQL ofrece JOINS que son más rápidos y usan menos memoria que el código de tu ejemplo.

Código:
SELECT friendship.* , miembros.*, noticias.* 
FROM friendship 
LEFT JOIN miembros ON friendship.pide=miembros.id
WHERE ...
P.D. no utilices comodines para traer todos los campos de la tabla, utilizas demasiada memoria, la consulta es mas lenta y cargas mas el servidor SQL
  #4 (permalink)  
Antiguo 13/10/2009, 13:40
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Seleccionar 3 tablas

^^ genial, muchas gracias, no entendía que los LEFT JOIN _ ON podían actuar como where.

SELECT friendship.* , miembros.*, noticias.*
FROM friendship
LEFT JOIN miembros ON ( (friendship.admite=$myid && friendship.pide=miembros.id) || (friendship.admite=miembros.id && friendship.pide=$myid) )
LEFT JOIN noticias ON noticias.de != $myid
order by noticias.id desc

Debe existir un friendship entre usuario y miembro, además de que la noticia no puede pertenecer al usuario (mostramos la de los amigos). Por tanto, estos JOIN actuan como WHERE, y en este caso actúan como que ambos deben cumplirse, como hago para que se aplique el OR entre los JOIN _ ON? Solo por curiosidad.
Gracias de nuevo.
Saludos.
  #5 (permalink)  
Antiguo 13/10/2009, 16:53
 
Fecha de Ingreso: mayo-2009
Ubicación: Madrid
Mensajes: 62
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Seleccionar 3 tablas

Ojo, no confundas los JOIN con los WHERE. El ejemplo que pones no es válido.

Los JOIN unen registros de dos o más tablas en base a un campo común, ya sea ON o USING
Además sirven para exigir integridad referencial en relaciones uno-a-uno y uno-a-varios:

SELECT users.name, numbers.mobile FROM users INNER JOIN numbers USING (id_usuario)

Cuando los JOINs nos han dado el conjunto de tablas y campos sobre los que queremos operar, nos delimitan una serie de registros de una tabla que tienen campos en común con otra(s) tabla(s).

Es entonces cuando aplicas un WHERE para filtrar dentro de esos registros. El JOIN no actúa como un WHERE, el WHERE se aplica sobre los registros que devuelve un JOIN

Investiga un poco más acerca de los distintos JOINs que te ofrece tu servidor SQL
  #6 (permalink)  
Antiguo 14/10/2009, 07:53
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Seleccionar 3 tablas

Tan dificil es que no puedes ayudarme con esa consulta?

Solo tengo que mostrar las noticias de los miembros en caso de que haya un registro en friendship vinculando al usuario con los respectivos miembros.

Gracias.
  #7 (permalink)  
Antiguo 14/10/2009, 08:02
 
Fecha de Ingreso: mayo-2009
Ubicación: Madrid
Mensajes: 62
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Seleccionar 3 tablas

Cita:
Iniciado por filmixt Ver Mensaje
Tan dificil es que no puedes ayudarme con esa consulta?
A ver, filmixt, no me gusta nada el tono de tu mensaje.
Te recuerdo que aqui nadie está obligado a ayudarte ni a hacerte el trabajo, así que menos humos, guárdate esas frases, relájate y mantén la educación.
Te he respondido ya en dos ocasiones, esta es la tercera. He dejado de hacer mi trabajo para responder a tu consulta y te he recomendado que estudies el funcionamiento de los JOINs, porque es imprescindible.
Cita:
Iniciado por filmixt Ver Mensaje
Solo tengo que mostrar las noticias de los miembros en caso de que haya un registro en friendship vinculando al usuario con los respectivos miembros.
No te voy a dar la consulta resuelta, porque el mismo tiempo que pierda yo en hacerla lo puedes invertir tú, porque una cosa es ayudar y otra es dártelo todo hecho. Si con las ayudas, los ejemplos y las indicaciones que te he dado no eres capaz de avanzar por ti mismo hasta resolverlo, es posible que no tengas una base lo suficientemente sólida como para hacer lo que haces.
Esfuérzate un poco más.
  #8 (permalink)  
Antiguo 14/10/2009, 12:29
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Seleccionar 3 tablas

No pretendía matizarlo con ningún tono, pero dado que no aplicaste mi caso en tu ejemplo, pareció que no pudieras ayudarme de forma más directa.
Evidentemente no tienes que ayudarme, pero si solicito ayuda, prefiero que me ayuden directamente, ya que ando muy ocupado con otros asuntos, y aprender consultas "avanzadas" mysql no es mi prioridad.
Por tanto, no pido más que el resultado. Si no me lo quieres proporcionar, pues ahí se zanja el asunto, ya que si quisiera aprender los joins me iria a tutoriales y no buscaría ayuda aquí.
Un saludo y disculpa el malentendido.
Me buscaré la vida.
  #9 (permalink)  
Antiguo 14/10/2009, 12:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Seleccionar 3 tablas

Cita:
pero si solicito ayuda, prefiero que me ayuden directamente, ya que ando muy ocupado con otros asuntos, y aprender consultas "avanzadas" mysql no es mi prioridad.
Creo que egruda te ofreció ayuda.

Si andas muy ocupado y no tienes tiempo de hacer tu trabajo, paga por el.

Cita:
Por tanto, no pido más que el resultado. Si no me lo quieres proporcionar, pues ahí se zanja el asunto, ya que si quisiera aprender los joins me iria a tutoriales y no buscaría ayuda aquí.
Yo te cobro por resultados, no por ayudas. De esta forma ni tienes que pasarte por un manual de mysql.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 14/10/2009, 14:53
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Seleccionar 3 tablas

De entrada, esto para mi es un hobby, y me parece insolito que pidan dinero en un Foro de ayuda Web, cuando encima solo pido una linea de programación, quizas algo extensa, pero ya está.

Menuda verguenza.

Si es demasiado pedir ayuda en un SELECT de MYSQL, con cierta dificultad, este foro no tiene ninguna finalidad. NINGUNA.

En fin, a ver por donde tiran las decisiones de los moderadores, porque vamos como esta el patio.
  #11 (permalink)  
Antiguo 14/10/2009, 15:24
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Seleccionar 3 tablas

En fin, finalmente me decidí por leerme la estructura join.

http://dev.mysql.com/doc/refman/5.0/es/join.html

Total, que lo he resuelto.
Gracias a Egrueda por darme al menos una pista, y gracias huesos por ofrecerte (vease la ironia).

Por mi condición, voy a dejar aqui el código, SIN COBRAR mira por donde, huesos52, para que cualquiera que se vea en la necesidad de asociar 3 tablas tenga el RESULTADO.

SELECT noticias.*
FROM noticias
LEFT JOIN miembros ON noticias.de = miembros.id
LEFT JOIN friendship ON friendship.pide=miembros.id || friendship.admite=miembros.id
WHERE (friendship.admite = $myid || friendship.pide = $myid) AND noticias.de != $myid
order by noticias.id desc

Un saludo.
  #12 (permalink)  
Antiguo 14/10/2009, 15:40
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Seleccionar 3 tablas

Cita:
huesos52
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 2.334
Si cobrara por cada post sería millonario

Simplemente para ayudar, me reservo el derecho de admisión.
Vos no aplicaste. jejeje
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #13 (permalink)  
Antiguo 15/10/2009, 08:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Seleccionar 3 tablas

Yo creo en este caso se aplica una frase muy conocida: "En el pedir, esta el dar".

Saludos.
  #14 (permalink)  
Antiguo 15/10/2009, 09:45
 
Fecha de Ingreso: mayo-2009
Ubicación: Madrid
Mensajes: 62
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: Seleccionar 3 tablas

O aquella otra de "Ante el vicio de pedir, la virtud de no dar"

Porque una cosa es pedir ayuda y otra es no querer aprender y cabrearse porque no le dan la solución con puntos y comas. Algunos no se dan cuenta de que la gente que les responde está dedicándoles gratuitamente su tiempo y conocimientos, y una cosa es enseñarte a pescar y otra prepararte una lubina al horno.

Yo, sinceramente, si veo que una persona no quiere aprender, si solo quiere quitarse el marrón de encima (o que se lo quiten), no me veo en la necesidad de ayudarle.

huesos52, ¿has pensado en cobrar 1€ por respuesta? Haz los cálculos
  #15 (permalink)  
Antiguo 15/10/2009, 11:32
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Seleccionar 3 tablas

No es por dar cuerda al asunto, pero egrueda, llevo 4 años aprendiendo, poquito a poco, el tema de la programación. Si tu me resuelves el problema, pues yo aprendo de el, por raro que te parezca, ya que mi coco da para llegar a eso.
Por otro lado, un foro está para resolver dudas, y no para ir soltando pistas dandotelas de profesor. Y digo más, hablas como si esto se tratara de un trabajo. ¿Marrón? Como ya te he dicho esto para mi es un hobby, y si algo no me sale, pregunto, y no espero como respuesta alguien que se las dé de sabiondo, y en vez de ayudar deja un ejemplo que no...
En fin, cada uno tiene sus formas.
A mi me preguntan algo, y si sé la respuesta se la dejo, y no le suelto un post para que se ponga el chaval a investigar, y allá el. La clave está en no juzgar.
Sino, dedicate a abrir un wordpress chulo y a poner posts con pistas de esas, a ver cuantas visitas captas.

Y hay que ser un hipócrita para cobrar en un foro. Si no tenéis para llegar a fin de mes, buscad empleo, y no siséis por foros con finalidad de ayudar a webmasters.

Que gente.
  #16 (permalink)  
Antiguo 15/10/2009, 11:51
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, 4 meses
Puntos: 2658
Respuesta: Seleccionar 3 tablas

filmixt:
Perdón que me meta,pero me gustaría destacar algunas cosas.

En el origen del post, el tema venía muy bien, con algunas gotas de humor y buenos aprtes, hasta que iniciaste el post numero 6 con esta frase:
Cita:
Tan dificil es que no puedes ayudarme con esa consulta?
Mil disculpas, si no estás de acuerdo, pero ¿no te parece que esta pregunta, tal y como está escrita, tiene una carga un tanto corrosiva? No parece que la hicieras con buenas intenciones, sino más bien suena a reclamo o queja... y las quejas no causan buena impresión.
A partir de allí la cosa se desvió de los carriles, y no hubo compostura. Agregaste algo así:
Cita:
No pretendía matizarlo con ningún tono, pero dado que no aplicaste mi caso en tu ejemplo, pareció que no pudieras ayudarme de forma más directa.
Evidentemente no tienes que ayudarme, pero si solicito ayuda, prefiero que me ayuden directamente, ya que ando muy ocupado con otros asuntos, y aprender consultas "avanzadas" mysql no es mi prioridad.
Por tanto, no pido más que el resultado. Si no me lo quieres proporcionar, pues ahí se zanja el asunto, ya que si quisiera aprender los joins me iria a tutoriales y no buscaría ayuda aquí.
Un saludo y disculpa el malentendido.
Me buscaré la vida.
En este, ya las frases no son corrosivas. Son despectivas, al menos para quienes tratamos de colaborar continuamente con el foro desinteresadamente. Por eso es que huesos52 te hizo la observación de que "pagaras por él", frase que en el contexto, es una buena respuesta ante ese segundo post.
Nadie sugirió, sino como humorada, que te va a cobrar en este foro por ayudarte, pero, vamos, el foro tiene por sentido el aprendizaje y no solamente corregirle códigos a los demás.
Si se tratase de dar códigos de uso directo, los obtendrías en un repositorio de soluciones, como por ejemplo la página de El Guille, porque ese es su sentido. Este foro tiene otra razón de ser. No es un depósito de codificaicones funcionales, sino de colaboración. Pero como en todos los foros de este tipo, lo que se te estuvo tratando de aportar en guías de desarrollo e investigación de modo que tu encuentres tus propias soluciones... ya que si no lo obtienes por ti mismo, ¿qué has aprendido realmente?
Como dejaste bien claro:
Cita:
esto para mi es un hobby
Por lo que entendemos que realmente no te importa en nada el área en la que nosotros dedicamos buena parte de nuestra vida: Bases de Datos. Entonces nos sentimos algo frustrados. Porque cuando alguien viene al foro a pedir ayuda, es porque realmente le importa el problema y como minimo se espera de parte de él un cierto esfuerzo... A fin de cuentas, es el mismo esfuerzo que nos piden a nosotros cuando solicitamos ayuda en el foro de Java, el .Net, los de ASP, etc.

En definitiva, no han sido buenas elecciones las frases que echaste a rodar, y lamentablemente has respondido un poco "arisco" a excelentes colaboradores, como son huesos52 y egrueda, quienes, si te tomas el tiempo en revisar su historial, verás que se toman muy en serio y con profundidad el colaborar con este foro.

Espero que leas con paciencia y comprensión estas palabras, y que, tal vez, en alguna otra ocasion vuelvas por este foro donde siempre encontrarás ayuda cuando se lo hace con cortesía.

Saludos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 15/10/2009, 16:10
 
Fecha de Ingreso: septiembre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 1
Exclamación Respuesta: Seleccionar 3 tablas

Razonamientos acertados, pero en cuanto a la pregunta "despectiva" no fué intencionada, como ya he dicho, pese a que me pueda haber expresado mal.

En cuanto a todo esto, esperaba ayuda directa. Si todas estas estupendas personas (no lo digo ironicamente) quieren por mi parte esfuerzo para llegar al resultado en vez de proporcionarmelo de entrada, no me parece mal, pero que lo digan, y yo les responderé cortésmente que me hace falta un resultado.

Que nadie quiere porque su ideología no concuerde con lo que solicito, pues que no responda. Pero pensaba que alguien en este foro tendría la... BONDAD de darme ese codigo.

Que no lo hubo, pues ya está.
Fijate por favor en otros temas si aplican la misma metodología de ayuda que vosotros, o les ayudan desarrollandoles el código.

Yo lo veo así. Si quiero ayudar, fácilmente le doy la respuesta que quiere. Sino, me pongo con mis asuntos, no me pondría a dejar pistas y como dije hacer de profesor.

Son como ves diferentes modos de verlo.
Saludos.
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 05:30.