Acá estamos de vuelta, me imagino un poco más experimentados con “esto” de las páginas dinámicas. Ya sabemos prácticamente cómo hacer las consultas, insertar datos en una tabla y modificarlos.
En la clase de hoy vamos a ir un poquito más allá y tratar de realizar consultas más complejas, uniendo diferentes tablas, relacionándolas, etc.
joins
Las consultas con “joins” prácticamente son para unir tablas por medio de un campo. Supongamos que tenemos dos tablas, la tabla usuarios y la tabla noticias. Ambas tienen los siguientes campos:
usuarios [ idUsuario, nombre, apellido ]
noticias [ idNoticia, titulo, cuerpo, idAutor ]
Fijense que en la tabla noticias no dejamos registro del nombre de la persona que escribió la noticia, dejamos solo la referencia a la tabla usuarios mediante una identificación única. Esto nos permite que a la hora de mostrar la noticia, si el usuario cambia uno de sus datos, ya sea porque el nombre estaba mal escrito, o una mujer que se casó y ahora quiere que se vea el apellido del marido también, o cualquier otro motivo, ahora solo va a tener que editar la tabla de usuarios, si nosotros hubiéramos puesto en la tabla noticias en lugar de idAutor, nombreDelAutor, al momento de actualizar la tabla de usuarios, también tendrÃamos que actualizar la de noticias.
Bueno, más o menos ya entendieron cuál es la idea al relacionar las tablas, ahora, qué pasa si nosotros hacemos una consulta del tipo SELECT en la tabla de noticias para traer el listado completo, no vamos a saber cuál es el autor, solo vamos a tener un numerito que hace referencia a la tabla de usuarios pero no sabemos el nombre, nos tenemos que ir a fijar a esa tabla.
Para evitar tener que hacer una nueva consulta es que existe una forma de generar las consultas agregando los “joins” y en una sola consulta chequeamos dos o más tablas al mismo tiempo.
La sintaxis es la siguiente:
SELECT noticias.titulo, noticias.cuerpo, usuarios.nombre, usuarios.apellido FROM noticias INNER JOIN usuarios ON noticias.idAutor = usuarios.idUsuario
De esta forma unimos ambas tablas, fÃjense que en las columnas primero aclaramos a que tabla pertenece lo que queremos traer y después el nombre del campo, lo mismo que cuando declaramos el INNER JOIN le tenemos que indicar con qué tabla queremos unir y después en ON le avisamos de qué forma es que unimos. Al final de esta consulta se puede poner sin problemas filtros del tipo WHERE, también ORDER BY y LIMIT.
Inner, Left y Right Joins
Existen varios tipos de joins, los tres más comunes son los que puse en el tÃtulo :). El inner join no va a mostrar ni un solo resultado si la condición de unión entre tablas no se cumple. Por ejemplo, si tenemos una noticia que tiene idAutor = 5 y en la tabla de usuarios se borró ese usuario, la noticia con el autor 5 no se va a mostrar si hacemos la consulta del tipo INNER.
Por el contrario si la consulta es del tipo LEFT se van a mostrar igual los resultados de las noticias con el autor 5 pero los datos del usuario van a aparecer en blanco. Y si es del tipo RIGHT, lo que hace esto es darle más peso a la segunda tabla, por ejemplo, tenemos aparte de las tablas anteriores una tabla más que es noticiasImágenes donde dejamos registro de las imágenes que le asignamos a una noticia
noticiasImagenes [idImagen, idNoticia, archivo]
Se puede dar el caso en que una noticia tenga varias imágenes, si nosotros hacemos la consulta de la siguiente forma:
SELECT noticias.titulo, noticias.cuerpo, noticiasImagenes.archivo FROM noticias RIGHT JOIN noticiasImagenes ON noticias.idNoticia = noticiasImagenes.idNoticia
Vamos a lograr que nos traiga como resultado tantas lÃneas como imágenes tenemos asignadas, repitiendo los datos de las noticias, por ejemplo, puede ser que los resultados sean asÃ:
idNoticia - titulo - imagen
1 - Taller de PHP - php.jpg
1 - Taller de PHP - logo.gif
Union
Otro tipo de consulta más compleja son los UNION, que sirve para combinar resultados de varias consultas del tipo SELECT. La sintaxis es:
SELECT ... UNION [ALL | DISTINCT] SELECT …
El union puede ser UNION ALL o UNION DISTINCT, con la primer opción va a traer todos los resultados encontrados en ambas tablas, y con DISTINCT solo los diferentes. Supongamos que tenemos dos tablas de noticias, una para las noticias publicadas y otra para el borrador, y nosotros queremos traer en una misma consulta todos los datos de ambas tablas ordenados por orden de fecha de creación, en estos casos es que tenemos que hacer la consulta del tipo UNION, para poder ordenar datos de dos tablas diferentes intercalando los datos entre un conjunto y otro.
Espero que les haya gustado la clase de hoy, hasta la semana que viene.
| << CLASE ANTERIOR |








Lunes, 30 de Junio de 2008 a las 13.12
¿ Porqué el nombre de la lección , “MySql - Consultas complejas”, no corresponde con el número de la clase, que según el temario es clase 21?
Gracias por tan excelentes clases, soy un aprendÃz, y espero poder aprovechar esta hermosa oportunidad de aprender.
Les deseo buena salud y éxitos por siempre.
Sinceramente JMP.
Lunes, 30 de Junio de 2008 a las 15.13
¡Hola, José!
Seguro debes tener el temario “desactualizado”, pégate una vuelta por el temario actual (clic aquÃ).
¡Saludos y gracias por tu consulta!
Martes, 15 de Julio de 2008 a las 04.38
Yo tengo leves nociones sobre php pero ya he programado en otros lenguajes, estoy siguiendo el curso al pie de la letra y me ha dado resultado, gracias, sigan adelante, exitos!
Jueves, 15 de Enero de 2009 a las 15.22
soy nuevo en PHP, y tengo una pregunta, en una consulta quiero que al manegar los datos mostrados, por ejemplo dar un clic en un registro y te pregunte si quieres borrarlo o no, gracias pero estoy perdido
Viernes, 21 de Mayo de 2010 a las 15.47
Hola como estas? queria preguntarte a ver si me podes ayudar…
Tengo 3 tablas, una es POSTULANTES, otra es EMPLEOS y otra es EMPLEO_POSTULADO que va a tener el cod de empleo al que se postulo el postulante y su cod_postulante
Yo quiero desarrollar en php y mysql un codigo que me diga por ejemplo:
DISEÑADOR:
- juan perez
- pepito
Administrativo:
- jose
- PEDRO
cHOFER:
- martin
- juan
Se entiende?? ya probe con group by e hice el siguiente codigo:
$query = mysql_query(”select distinct cod_empleo,cod_usuario from empleo_postulado order by cod_empleo”) or die(mysql_error());
while ($res = mysql_fetch_array($query)){
$cod_empleo = $res[cod_empleo];
$query2 = mysql_query(”select puesto_empleo from empleos where cod_empleo=’$cod_empleo’ order by cod_empleo”) or die(mysql_error());
while ($resi = mysql_fetch_array($query2)){
echo ” ” . $resi[puesto_empleo] . “.”;
$cod_usuario= $res[cod_usuario];
$query3 = mysql_query(”select usuario, email from usuarios where cod_usuario=’$cod_usuario’ order by cod_usuario”) or die(mysql_error());
while ($resi2 = mysql_fetch_array($query3)){
echo ” ” . $resi2[usuario] . ” /// Email: “. $resi2[email] . ” “;
}
}
}
La cosa es que el resultado es este:
Diseñador.
pepito /// Email: pepito@gmail.com
Diseñador.
Juan /// Email: juan@gmail.com
Data entry.
pepito/// Email: pepito@gmail.com
Abogado.
juancito /// Email: juancito@gmail.com
Abogado.
pedro /// Email: pedro@gmail.com
Me pone 2 veces el mismo trabajo, no es q me pone
Diseñador:
-pepito
-juan
Por favor como podria hacer??
Gracias por la respuesta!!!!
Saludos
Domingo, 14 de Noviembre de 2010 a las 04.00
hola q tal amigo gracias por todo, a sido de gran ayuda todo lo q nos proporcionas…. GRACIAS!!…
Jueves, 13 de Enero de 2011 a las 22.15
No entiendo:
“Se puede dar el caso en que una noticia tenga varias imágenes, si nosotros hacemos la consulta de la siguiente forma: ….”
Según lo dicho anteriormente se entiende que una naoticia puede tener varias imágenes pero no por el “RIGHT JOIN” sino que el right join nos podrá dar imágenes sin noticia relacionada.