Foros Programación Servidor
Consultar en dos tablas
7 7 Respuestas Viernes 15 de enero, 2010
Hola! Pregunto en esta oportunidad por un problema que me surge al usar mysql_query para unir dos tablas ¿Qué estoy haciendo mal?
personas_tb tiene --> id_persona y nombreusuario
proyecto_tb tiene --> codigo_proy, titulo, alumno, estado
COINCIDEN nombreusuario = alumno
pues bien, quiero obtener el resultado de alumnos que tienen cierto estado (Asignado, Finalizado, Publicado)
Lo he estado haciendo tal que así, pero...
el resultado que obtengo es un listado de todas las personas en mi base de datos y el campo de proyecto (titulo y código_proy) sólo en aquellos que mi variable GET coincide con el estado....
en definitiva, cómo quito los resultados que no son mi variable?
¡gracias!
personas_tb tiene --> id_persona y nombreusuario
proyecto_tb tiene --> codigo_proy, titulo, alumno, estado
COINCIDEN nombreusuario = alumno
pues bien, quiero obtener el resultado de alumnos que tienen cierto estado (Asignado, Finalizado, Publicado)
Lo he estado haciendo tal que así, pero...
$result = mysql_query("SELECT codigo_proy, titulo, alumno, id_persona, nombreusuario FROM proyecto_tb, personas_tb WHERE alumno = nombreusuario AND estado='$_GET[muestra]' ",$link) or die(mysql_error());
el resultado que obtengo es un listado de todas las personas en mi base de datos y el campo de proyecto (titulo y código_proy) sólo en aquellos que mi variable GET coincide con el estado....
en definitiva, cómo quito los resultados que no son mi variable?
¡gracias!
-
Cloudstudio
Registrado desde 05/05/09 / Número de posts: 537
Para seleccionar resultados de 2 tablas, no puedes separarlos con una , ( coma)
Tienes que utilizar la setencia JOIN, http://es.wikipedia.org/wiki/Join es sencilla de usar de todos modos si no te aclaras siempre puedes optar por hacer 2 querys.
-
skuareisnext
Registrado desde 27/05/04 / Número de posts: 70
puedo usar dos querys?
sería un query con un while y dentro del while otro query? -
Marcos MPC
Registrado desde 10/10/08 / Número de posts: 56
En realidad sí se pueden unir dos tablas como lo ha hecho skuareisnext (si no lo filtras con un WHERE te daría todas las combinaciones posibles entre las filas de las dos tablas). En la consulta no veo nada que cante que está mal, lo mismo conviene que identifiques en el WHERE a qué tabla corresponde cada campo (proyecto_tb.alumno en vez de alumno) pero ayer mismo yo monté una consulta así con tres tablas y funcionó. Era tal que así:"SELECT id, nombre, apellido1, poblacion, comunidad FROM contactos AS c, poblaciones AS p, CCAA WHERE c.id_poblacion=p.id_poblacion AND p.id_CCAA=CCAA.id_CCAA AND id=".$_GET["id"]
De todas formas lo mejor por eficiencia y sencillez es hacer un JOIN como dice Cuviline. -
Cloudstudio
Registrado desde 05/05/09 / Número de posts: 537
$result = mysql_query("SELECT * FROM proyecto_tb WHERE alumno = nombreusuario AND estado='$_GET[muestra]' ",$link)$result 1= mysql_query("SELECT * FROM personas_tb WHERE alumno = nombreusuario AND estado='$_GET[muestra]' ",$link)
Repites la sentencia y listo. -
skuareisnext
Registrado desde 27/05/04 / Número de posts: 70
ahhh!!! pesadilla!!
He intentado uno de los tipos de join,$result = mysql_query("SELECT * FROM personas_tb INNER JOIN proyecto_tb ON (personas_tb.nombreusuario = proyecto_tb.alumno AND proyecto_tb.estado = 'Finalizado')",$link) or die(mysql_error());
Me devuelve una lista de TODAS mis personas y en aquellos cuyo estado es finalizado les pone su titulo de proyecto
el código completo es..<?php
$result = mysql_query("SELECT * FROM personas_tb INNER JOIN proyecto_tb ON (personas_tb.nombreusuario = proyecto_tb.alumno AND proyecto_tb.estado = 'Finalizado')",$link) or die(mysql_error());
$i=0;
while($row = mysql_fetch_array($result)) {
$lid_persona = $row['id_persona'];
$lnombreusuario = $row['nombreusuario'];
$lcodigo_proy = $row['codigo_proy'];
$ltitulo = $row['titulo'];
echo "$lid_persona - $lnombreusuario - $ltitulo - $lcodigo_proy";
}
mysql_free_result($result);
?>
He intentado también lo siguiente - sin resultados:<?php
$result = mysql_query("SELECT * FROM proyecto_tb WHERE estado = 'Finalizado'",$link) or die(mysql_error());
$i=0;
while($row = mysql_fetch_array($result)) {
$lalumno = $row['alumno'];
$lcodigo_proy = $row['codigo_proy'];
$ltitulo = $row['titulo'];
$result1 = mysql_query("SELECT * FROM personas_tb WHERE nombreusuario = '$lalumno'",$link) or die(mysql_error());
$row = mysql_fetch_array($result1);
$lid_persona = $row['id_persona'];
mysql_free_result($result1);
echo "$lid_persona - $lalumno - $titulo - $lcodigo_proy";
}
mysql_free_result($result);
?>
CORRECCIÓN!!!!
=) muchas gracias, con este último ejemplo funciona -
markshock
Registrado desde 21/03/05 / Número de posts: 780
Ojito con los INNER JOIN, tienen la peculiaridad de que solo te devolverá los campos que cumplan la comparación, si quieres un listado de todos los campos indistintamente que cumplan la condicion o no, usa el LEFT JOIN.
Suele ser un error bastante común cuando se empieza a usar JOIN intentar obtener un listado de la unión de 2 tablas y que te vuelvas loco intentando averiguar por que no te devuelve nada... :P
Por cierto, unos consejitos....
1.- Intenta evitar los "SELECT * " cargan mucho las consultan y realmente nunca necesitas todos los campos de una tabla.
2.- Los campos que usas como "estado" puedes usar o bien un boolean (true/false) o si vas a tener mas de 2 estados puedes usar un campo (Tynint o enum) de esta manera puedes asociar número a estados 1- OK / 2- Offline / 3 - Stand By ....
3.- Intenta trabajar con ID's en las tablas, es mas rápido buscar id_alumno = 3 que alumno = "Jose fernandez de las mercedes"
Saludos y animo socio!Desarrollo web, servicios integrales en internet
Work: http://www.estadoactivo.com
Yo: http://www.marctorres.es
Blog: http://www.marc-torres.com -
Cloudstudio
Registrado desde 05/05/09 / Número de posts: 537
Me alegro que te funcione, para cualquier cosa aqui estamos
Áreas Domestika
- Diseño (gráfico, web, industrial, producto)
- Programación (cliente, servidor, accesibilidad)
- Ilustración (autores, inspiración, técnicas)
- Fotografía (técnica, equipo, autores)
- Motion Graphics (showreels, software, estudios)
- Publicidad (campañas, anuncios, ideas)
- Informática (software, hardware, trucos)
- 3D (técnicas, iluminación, modelado)
- Experiencia de Usuario (usabilidad, AI, HCI)
- Cine, vídeo y televisión (críticas, producción)
- Música y Audio (sonidos, loops, discos)
- Espacios (arquitectura, interiorismo)