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

Consulta para el cruce de 2 tablas

Estas en el tema de Consulta para el cruce de 2 tablas en el foro de Mysql en Foros del Web. Muy buenos días a todos y ante todo gracias por vuestra ayuda! Mi problema es el siguiente... Dentro de una herramienta de administración estoy haciendo ...
  #1 (permalink)  
Antiguo 01/04/2011, 03:58
 
Fecha de Ingreso: abril-2009
Ubicación: Vitoria
Mensajes: 160
Antigüedad: 15 años
Puntos: 1
Pregunta Consulta para el cruce de 2 tablas

Muy buenos días a todos y ante todo gracias por vuestra ayuda!

Mi problema es el siguiente...

Dentro de una herramienta de administración estoy haciendo un sistema para gestionar los asistentes que han venido a unos cursos.
Por un lado tengo una tabla de asistentes, por otro lado tengo otra tabla de cursos y por último la tabla que las relaciona ya que a un curso vienen varios asistentes y un asistente puede venir a mas de un curso.

La cosa es que dentro de la herramienta necesito una consulta para mostrar todos los asistentes de la base de datos excepto lo que ya estan apuntados al curso, para poder añadirlos a través de un formulario en caso de que vengan.

las tablas serían las siguientes, no pongo todos los campos por que en principio no son necesarios:
asistente -> cod_asistente, as_nombre, as_apellido...
curso -> cod_curso, cur_nombre...
rel_curso_asistente -> cod_asistente, cod_curso...

Estoy casi seguro de que en una única consulta podría obtener lo que necesito pero no he sido capaz de sacarla.

Gracias de nuevo por vuestra atención, y espero que puedan ayudarme!
Un saludo!
  #2 (permalink)  
Antiguo 01/04/2011, 05: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: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta para el cruce de 2 tablas

Eso se hace con LEFT JOIN, que te devuelve todo lo que está en la tabla izquierda que concida o no con la derecha. En ese punto lo que se hace es obtener aquellos que tienen NULL en su relación con la izquierda:
Código MySQL:
Ver original
  1. SELECT A.*
  2. FROM asistentes A left JOIN asistentes_curso AC ON A.asistente_id = AC.asistente_id
  3. WHERE AC.asistente_id IS NULL;
En el caso de querer sólo lo referido a un curso, tienes que filtrar por curso:

Código MySQL:
Ver original
  1. SELECT A.*
  2. FROM asistentes A left JOIN asistentes_curso AC ON A.asistente_id = AC.asistente_id
  3. WHERE AD.curso_id = valorbuscado AND AC.asistente_id IS NULL;
__________________
¿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 01/04/2011, 06:05
 
Fecha de Ingreso: abril-2009
Ubicación: Vitoria
Mensajes: 160
Antigüedad: 15 años
Puntos: 1
Respuesta: Consulta para el cruce de 2 tablas

Muchas gracias Gnzsoloyo, entiendo el efecto de la consulta y es lo que estoy buscando, pero no me devuelve ningun resultado:

Algo no estoy poniendo correcto....

Código MySQL:
Ver original
  1. SELECT A.cod_asistente, A.as_nombre, A.as_apellidos, A.as_pais
  2. FROM asistente A
  3. LEFT JOIN rel_curso_asistente RCA ON A.cod_asistente = RCA.cod_asistente
  4. WHERE RCA.cod_curso = '$curso'
  5. AND RCA.cod_asistente IS NULL

Intento explicarlo mas sencillo y claro... por que casi no lo entiendo ni yo...

Necesito sacar todos los asistentes de la tabla asistente que no esten apuntados al curso '$curso'.
  #4 (permalink)  
Antiguo 01/04/2011, 06:15
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: Consulta para el cruce de 2 tablas

Vamos por partes. Probemos primero esto, que puede acercarnos un poco mejor:
Código MySQL:
Ver original
  1.     A.cod_asistente,
  2.     A.as_nombre,
  3.     A.as_apellidos,
  4.     A.as_pais
  5. FROM asistente A
  6.     RCA.cod_asistente NOT IN (SELECT RCA.cod_asistente FROM rel_curso_asistente RCA WHERE RCA.cod_curso = '$curso');
(La lógica del anterior puede que no estuviera buena, al menos en el segundo caso).
__________________
¿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 01/04/2011, 06:51
 
Fecha de Ingreso: abril-2009
Ubicación: Vitoria
Mensajes: 160
Antigüedad: 15 años
Puntos: 1
De acuerdo Respuesta: Consulta para el cruce de 2 tablas

Con respecto al caso anterior, si utilizo esta consulta:
Código MySQL:
Ver original
  1. SELECT A.cod_asistente, A.as_nombre, A.as_apellidos, A.as_pais
  2. FROM asistente A
  3. LEFT JOIN rel_curso_asistente RCA ON A.cod_asistente = RCA.cod_asistente
  4. WHERE RCA.cod_curso = '$curso'

Me aparecen los asistentes al curso.

Y utilizando la que acabas de postear pero haciendo un pequeño cambio
Código MySQL:
Ver original
  1. SELECT A.cod_asistente, A.as_nombre, A.as_apellidos, A.as_pais FROM asistente A
  2. WHERE A.cod_asistente NOT IN (SELECT RCA.cod_asistente FROM rel_curso_asistente RCA WHERE RCA.cod_curso = '$curso');

Consigo lo que estoy buscando y de una forma mucho mas adecuada que la que estaba intentando desarrollar con miles de sentencias en PHP.

Muchas gracias gnzsoloyo, ha sido todo un placer!
  #6 (permalink)  
Antiguo 01/04/2011, 07: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: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta para el cruce de 2 tablas

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: 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 17:44.