Justi 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 (8)

  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!

  4. Daniel dice:

    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

  5. johanna dice:

    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

  6. Xak dice:

    hola q tal amigo gracias por todo, a sido de gran ayuda todo lo q nos proporcionas…. GRACIAS!!…

  7. Guada dice:

    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.

  8. andre dice:

    Hola excelente ejemplos, pero a la final encontré como realizar este tipo de consultas con la clausula where en un post. Espero les sirva como a mi, ya que entendi rapidamente como hacerlo :)

Deja tu opinión

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