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

consulta con join en tres tablas

Estas en el tema de consulta con join en tres tablas en el foro de Mysql en Foros del Web. hola mi consulta es la siguientetengo 4 tablas con sus campos t_foro_respuestas id_foro,noIdentidad,titulo,fecharecibo t_ag_orientadores noIdentidad,nombre,departamento,municipio t_ag_educativos noIdentidad,nombre,departamento,municipio t_ag_invitados noIdentidad,nombre,departamento,municipio necesito que la consulta me de ...
  #1 (permalink)  
Antiguo 25/04/2010, 16:41
 
Fecha de Ingreso: octubre-2009
Mensajes: 68
Antigüedad: 14 años, 6 meses
Puntos: 1
consulta con join en tres tablas

hola mi consulta es la siguientetengo 4 tablas
con sus campos

t_foro_respuestas
id_foro,noIdentidad,titulo,fecharecibo

t_ag_orientadores
noIdentidad,nombre,departamento,municipio

t_ag_educativos
noIdentidad,nombre,departamento,municipio

t_ag_invitados
noIdentidad,nombre,departamento,municipio

necesito que la consulta me de
todos los agentes de las 3 ultimas tablas que coincidan con un departamento
que se escoge deun select y se almacena en la variable $departamento
la tabla deberia quedar asi dandome la lista de los campos

noIdentidad, nombres,titulo,fecharecibo,departamento,municipio

yo hice esta consulta pero no me sirve por favor ayuda



$ssql="SELECT t_ag_educativos.noIdentidad, t_ag_educativos.primerNombre, t_ag_educativos.segundoNombre, t_ag_educativos.primerApellido, t_ag_educativos.segundoApellido,t_ag_educativos.de partamento,t_ag_orientadores.noIdentidad, t_ag_orientadores.primerNombre, t_ag_orientadores.primerApellido, t_ag_orientadores.departamento,t_ag_invitados.noId entidad, t_ag_invitados.primerNombre, t_ag_invitados.primerApellido, t_ag_invitados.departamento, t_foro_respuestas.titulo,t_foro_respuestas.fechaRe cibo
FROM `t_ag_educativos`,t_ag_orientadores,t_ag_invitados
JOIN `t_foro_respuestas` ON t_ag_educativos.noIdentidad = t_foro_respuestas.noIdentidad
JOIN `t_foro_respuestas` ON t_ag_orientadores.noIdentidad = t_foro_respuestas.noIdentidad
JOIN `t_foro_respuestas` ON t_ag_invitados.noIdentidad = t_foro_respuestas.noIdentidad
WHERE t_ag_educativos.departamento = '$departamento' OR t_ag_orientadores.departamento = '$departamento' OR t_ag_invitados.departamento = '$departamento'";

Última edición por laupatri1084; 25/04/2010 a las 16:47
  #2 (permalink)  
Antiguo 26/04/2010, 23:27
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: consulta con join en tres tablas

Hola
Bueno, pues viendo tu estructura de tablas

Código:
t_ag_orientadores
 noIdentidad,nombre,departamento,municipio
 
 t_ag_educativos
 noIdentidad,nombre,departamento,municipio
 
 t_ag_invitados
 noIdentidad,nombre,departamento,municipio
te recomendaria que uses una sola tabla que sea por ej t_ag_entes y que
tengas un campo llamado "tipo" por ej donde guardes lo que es cada uno
(orientador,educador,invitados,y otros que a futuro tengas)

Pero bueno, tomando el curso del post, yo te recomendaria usar
el UNION SELECT para que puedas traer los datos de las distintas tablas,
asi entonces tendrías este código

Código MySQL:
Ver original
  1. t_ag_educativos.noIdentidad,
  2. t_ag_educativos.primerNombre, t_ag_educativos.segundoNombre, t_ag_educativos.primerApellido, t_ag_educativos.segundoApellido,
  3. t_ag_educativos.departamento, t_ag_educativos.municipio,
  4. t_foro_respuestas.titulo,t_foro_respuestas.fechaRecibo
  5. FROM t_foro_respuestas
  6. INNER JOIN t_ag_educativos ON t_ag_educativos.noIdentidad = t_foro_respuestas.noIdentidad
  7. WHERE t_ag_educativos.departamento = '$departamento'
  8. t_ag_orientadores.noIdentidad,
  9. t_ag_orientadores.primerNombre, t_ag_orientadores.segundoNombre, t_ag_orientadores.primerApellido, t_ag_orientadores.segundoApellido,
  10. t_ag_orientadores.departamento, t_ag_orientadores.municipio,
  11. t_foro_respuestas.titulo,t_foro_respuestas.fechaRecibo
  12. FROM t_foro_respuestas
  13. JOIN t_ag_orientadores ON t_ag_orientadores.noIdentidad = t_foro_respuestas.noIdentidad
  14. WHERE t_ag_orientadores.departamento = '$departamento'
  15. t_ag_invitados.noIdentidad,
  16. t_ag_invitados.primerNombre, t_ag_invitados.segundoNombre, t_ag_invitados.primerApellido, t_ag_invitados.segundoApellido,
  17. t_ag_invitados.departamento, t_ag_invitados.municipio,
  18. t_foro_respuestas.titulo,t_foro_respuestas.fechaRecibo
  19. FROM t_foro_respuestas
  20. JOIN t_ag_invitados ON t_ag_invitados.noIdentidad = t_foro_respuestas.noIdentidad
  21. WHERE t_ag_invitados.departamento = '$departamento';

Y finalmente una sugerencia para esas consultas con nombres de tablas extensos, es que le pongas un "alias" a las tablas para que sean mas cortas, por ej:

Código MySQL:
Ver original
  1. SELECT t_inv.noIdentidad, t_resp.titulo FROM t_foro_respuestas t_resp
  2. JOIN t_ag_invitados t_inv ON t_inv.noIdentidad = t_resp.noIdentidad
  3. WHERE t_inv.departamento = '$departamento';

Bueno, espero te sirva
saludos
  #3 (permalink)  
Antiguo 27/04/2010, 11:03
 
Fecha de Ingreso: octubre-2009
Mensajes: 68
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: consulta con join en tres tablas

muchas gracias por tu ayuda ,me sirvio mucho
ahora tengo otra duda tengo que realizar la siguiente consulta escogiendo un agente en particular para esto ya tengo su numero de identidad almacenado pero como hago para consultar solo los datos de ese agente en particular


$tipo=$agentes['tipo'];//el tipo de agente
$noIdentidad=$agentes['noIdentidad'];//el numero de identidad

switch ($tipo)
{
case "Agente Educativo":
$ssql="SELECT t_ag_educativos.noIdentidad, t_ag_educativos.primerNombre, t_ag_educativos.segundoNombre, t_ag_educativos.primerApellido, t_ag_educativos.segundoApellido,t_ag_educativos.de partamento,t_ag_educativos.municipio,t_foro_respue stas.titulo,t_foro_respuestas.fechaRecibo
FROM `t_ag_educativos`,`t_foro_respuestas`
WHERE t_ag_educativos.noIdentidad = t_foro_respuestas.noIdentidad AND fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'";
break;
case "Agente Orientador":
$ssql="SELECT t_ag_orientadores.noIdentidad, t_ag_orientadores.primerNombre, t_ag_orientadores.segundoNombre, t_ag_orientadores.primerApellido, t_ag_orientadores.segundoApellido,t_ag_orientadore s.departamento,t_ag_orientadores.municipio,t_foro_ respuestas.titulo,t_foro_respuestas.fechaRecibo
FROM `t_ag_orientadores`,`t_foro_respuestas`
WHERE t_ag_orientadores.noIdentidad = t_foro_respuestas.noIdentidad AND noIdentidad='$noIdentidad' AND fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'";
break;
case "Agente Invitado":
$ssql="SELECT t_ag_invitados.noIdentidad, t_ag_invitados.primerNombre, t_ag_invitados.segundoNombre, t_ag_invitados.primerApellido, t_ag_invitados.segundoApellido,t_ag_invitados.depa rtamento,t_ag_invitados.municipio,t_foro_respuesta s.titulo,t_foro_respuestas.fechaRecibo
FROM `t_ag_invitados`,`t_foro_respuestas`
WHERE t_ag_invitados.noIdentidad = t_foro_respuestas.noIdentidad AND noIdentidad='$noIdentidad' AND fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'";
break;
}

como hago la consulta para que escoga solo el agente que me interesa y cuyo numero de documento tengo almacenado en $no Identidad
Gracias
  #4 (permalink)  
Antiguo 27/04/2010, 16:43
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: consulta con join en tres tablas

Hola
Bueno, en la primera opción del case no tienes un filtro para el documento de identidad, pero en los otros dos casos si

Ahora, tu consulta que tienes por ej en el case de invitados esta perfecta, solo tienes un inconveniente y es el siguiente

Código:
AND noIdentidad='$noIdentidad'
esto te debe estar mostrando un warning porque el campo es ambiguo,
osease, que hay 2 tablas involucradas en esta consulta que tienen el mismo
nombre de campo, y no se decide cual usar, así que es mejor que tu le digas cual usar, así

Código:
AND t_foro_respuestas.noIdentidad='$noIdentidad'
Con eso debe bastar para que te funcione, nos comentas
saludos
  #5 (permalink)  
Antiguo 04/05/2010, 11:15
 
Fecha de Ingreso: octubre-2009
Mensajes: 68
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: consulta con join en tres tablas

muchas gracias en lo noIdentidad tenias razon mostraba warning .
ahora mi consulta se complica un poco mas porque necesito que de la union de esta 3 tablas me cuente cuantas participaciones se dan por municipio ,es decir contar las participaciones de los municipios en la consulta anterior
algo asi
Municipio count(*)
municipio1 4
municipio2 10
intente algo sin exito porque no se como tomar las columnas de mi consulta
se que necesito agrupar por municipio y luego utilizar count(*) pero como es apartir de la union no se como hacerlo.
muchas gracias he solucionado muchas dudas en este foro.

Intente algo pero se que tengo cosas redundantes esta consulta me cuenta las participaciones pero en todas las tabla t_foro_respuestas no solo en el rango de fechas
$ssql2="(SELECT t_ag_educativos.noIdentidad, t_ag_educativos.primerNombre, t_ag_educativos.segundoNombre, t_ag_educativos.primerApellido, t_ag_educativos.segundoApellido,t_ag_educativos.de partamento,t_ag_educativos.municipio,t_foro_respue stas.titulo,t_foro_respuestas.fechaRecibo,count(*)
FROM `t_ag_educativos`,`t_foro_respuestas`
WHERE t_ag_educativos.noIdentidad = t_foro_respuestas.noIdentidad AND departamento='$departamento' AND fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'
group by municipio
having fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'
order by noIdentidad)
UNION
(SELECT t_ag_orientadores.noIdentidad, t_ag_orientadores.primerNombre, t_ag_orientadores.segundoNombre, t_ag_orientadores.primerApellido, t_ag_orientadores.segundoApellido,t_ag_orientadore s.departamento,t_ag_orientadores.municipio,t_foro_ respuestas.titulo,t_foro_respuestas.fechaRecibo,co unt(*)
FROM `t_ag_orientadores`,`t_foro_respuestas`
WHERE t_ag_orientadores.noIdentidad = t_foro_respuestas.noIdentidad AND departamento='$departamento'AND fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'
group by municipio
having fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'
order by noIdentidad)
UNION
(SELECT t_ag_invitados.noIdentidad, t_ag_invitados.primerNombre, t_ag_invitados.segundoNombre, t_ag_invitados.primerApellido, t_ag_invitados.segundoApellido,t_ag_invitados.depa rtamento,t_ag_invitados.municipio,t_foro_respuesta s.titulo,t_foro_respuestas.fechaRecibo,count(*)
FROM `t_ag_invitados`,`t_foro_respuestas`
WHERE t_ag_invitados.noIdentidad = t_foro_respuestas.noIdentidad AND departamento='$departamento' AND fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'
group by municipio
having fechaRecibo >='$desde1' AND fechaRecibo <='$hasta1'
order by noIdentidad)";
}

Última edición por laupatri1084; 04/05/2010 a las 11:56
  #6 (permalink)  
Antiguo 05/05/2010, 18:10
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: consulta con join en tres tablas

Hola
Bueno, pues observe varias cosas

1. Con el group by tiene inconvenientes de hacer el conteo
2. Tienes para las fechas AND y HAVING por aparte, pero pues
hice pruebas y cualquiera de los dos hacen correctamente el filtro,
así que te recomiendo que solo uses uno de los dos
3. Cuando se hacen consultas UNION el ORDER BY debe ir solo al final
de toda la consulta como podrás notar en el que te voy a postear
4. Lo que yo hice fue agregar el count(*) en la consulta del UNION que
te habia posteado anteriormente en cada uno de los selects, y omitir
el group by pues aquí ya vienen agrupados gracias al inner join respectivo

Código MySQL:
Ver original
  1. t_ag_educativos.noIdentidad,
  2. t_ag_educativos.primerNombre, t_ag_educativos.segundoNombre,  t_ag_educativos.primerApellido, t_ag_educativos.segundoApellido,
  3. t_ag_educativos.departamento, t_ag_educativos.municipio,
  4. t_foro_respuestas.titulo,t_foro_respuestas.fechaRecibo, count(*)
  5. FROM t_foro_respuestas
  6. INNER JOIN t_ag_educativos ON t_ag_educativos.noIdentidad =  t_foro_respuestas.noIdentidad
  7. WHERE t_ag_educativos.departamento = '$departamento'
  8. t_ag_orientadores.noIdentidad,
  9. t_ag_orientadores.primerNombre, t_ag_orientadores.segundoNombre,  t_ag_orientadores.primerApellido, t_ag_orientadores.segundoApellido,
  10. t_ag_orientadores.departamento, t_ag_orientadores.municipio,
  11. t_foro_respuestas.titulo,t_foro_respuestas.fechaRecibo, count(*)
  12. FROM t_foro_respuestas
  13. JOIN t_ag_orientadores ON t_ag_orientadores.noIdentidad =  t_foro_respuestas.noIdentidad
  14. WHERE t_ag_orientadores.departamento = '$departamento'
  15. t_ag_invitados.noIdentidad,
  16. t_ag_invitados.primerNombre, t_ag_invitados.segundoNombre,  t_ag_invitados.primerApellido, t_ag_invitados.segundoApellido,
  17. t_ag_invitados.departamento, t_ag_invitados.municipio,
  18. t_foro_respuestas.titulo,t_foro_respuestas.fechaRecibo, count(*)
  19. FROM t_foro_respuestas
  20. JOIN t_ag_invitados ON t_ag_invitados.noIdentidad =  t_foro_respuestas.noIdentidad
  21. WHERE t_ag_invitados.departamento = '$departamento'
  22. order by noIdentidad

Bueno, espero te sirva
saludos

Etiquetas: join, tablas, tres
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 12:15.