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!