Justi Lunes, 16 de Junio de 2008 a las 13.00
   Imprimir artículo
elWebmaster.com

Taller de PHP: MySql – Consultas complejas

Logo de taller PHPAcá 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  

CLASE SIGUIENTE >>

Enviar a Del.icio.us Enviar a Meneame Enviar a Digg Enviar a Fresqui Enviar a Enchilame

Comentarios (3)

  1. José María Puentes S. dice:

    ¿ 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.

  2. Juan Manuel dice:

    ¡Hola, José!

    Seguro debes tener el temario “desactualizado”, pégate una vuelta por el temario actual (clic aquí).

    ¡Saludos y gracias por tu consulta!

  3. yaisury dice:

    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!

Deja tu opinión

© 2007 - 2008 elWebmaster.com | Powered by Wordpress | Diseño CSS y XHTML válido. | Algunos íconos basados en FamFamFam Mini
Iniciar Sesión