Uniendo tablas MySQL (III). Autocombinaciones.

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Siguiendo con el tema de uniones de tablas, en este artículo vamos a ver un tema que, en el día a día del desarrollo de aplicaciones, se da con más frecuencia de la que parece: las autocombinaciones. En los artículos anteriores hemos conocido distintas formas de combinar datos de dos tablas, para obtener el resultado deseado. Aquí vamos a aprender como combinar datos de una tabla con datos procedentes de la misma tabla, que mantienen una relación estructural.

Cómo siempre, lo veremos desarrollando un ejemplo, que podremos extrapolar a cualquier otra necesidad que nos surja en este terreno.

EL ESCENARIO

Cómo ya es habitual, empezaremos definiendo el escenario a partir del que trabajaremos. Tenemos una base de datos con una tabla de empleados llamada, precisamente, empleados. La hemos simplificado mucho, para centrarnos en lo que vamos a hacer, evitando que un exceso de datos nos dificulte ver la operativa. Cada empleado tiene un id (que es un valor autoincrementable) y su nombre (una cadena de texto). Además, tiene un tercer campo numérico en el que se almacena el id de su superior jerárquico. Todos los empleados tienen un superior. Como se supone que el “jefe” o dueño de la compañía no tiene superior, el superior es él mismo. La tabla podría parecerse a la siguiente:

id id_de_superior nombre
1 1 Francisco Muñoz Torres
2 1 Sonia Pérez De La Fuente
3 2 Antonio García Morales

En esta muestra sólo vemos tres empleados, para no sobrecargar aquí. En la tabla de ejemplo que te adjunto al final de este artículo tienes más de 40 empleados, para que puedas comprobar a gusto que todo funciona.

Lo que pretendemos es obtener una lista de los empleados, ordenados por nombre, de tal modo que, al lado de cada uno aparezca el nombre de su superior que, como hemos apuntado, es también un empleado en la misma tabla.

CÓMO HACER UNA AUTOCOMBINACIÓN

Cuando hacemos una consulta que implica obtener datos de una tabla siguiendo dos criterios (en nuestro ejemplo, estos son obtener el id y nombre de cada empleado y obtener el nombre del empleado cuyo id coincide con el id_de_superior del empleado en curso), tenemos que referenciar la tabla con dos alias, como si fueran dos tablas diferentes. En otras versiones de SQL (como SQL Server) se emplea la palabra reservada ALIAS. En MySQL se emplea la cláusula AS. En cualquier caso, lo que hacemos es asignarle un alias a la tabla para cada uno de los criterios. Lo vamos a ver claramente a continuación.

AUTOCOMBINACIÓN “CLÁSICA”

La consulta para obtener el resultado deseado sería la siguiente:

Si pruebas esta consulta con la tabla de este ejercicio verás que funciona perfectamente. Veamos que hemos hecho. En primer lugar vamos a fijarnos en la cláusula FROM que, como ya sabes, es donde le indicamos a una consulta la(s) tabla(s) de la(s) que vamos a leer. Fíjate en que se menciona dos veces la tabla empleados, con un alias distinto en cada caso, como si fueran dos tablas diferentes, que se llamarán trabajadores y superiores:

FROM empleados AS trabajadores, empleados AS superiores

Por supuesto, no es que el motor de MySQL cree dos copias de la tabla. Esta es única y no sufre alteración alguna. Es sólo que “engañamos” a la consulta para que parezca que trabajamos con dos tablas.

A partir de ahí, ya no hay nada de particular. El resto de la consulta es igual que si, realmente, tuviéramos los datos en dos tablas aisladas. Cómo ves, una vez que se comprende este principio, el uso de autocombinaciones es lo más simple del mundo.

AHORA CON INNER JOIN

Ya que, a los efectos de la consulta, al emplear alias estamos simulando el uso de dos tablas, obtener el mismo resultado con INNER JOIN, que ya conocemos de un artículo anterior, es igual de fácil.

Para que puedas comprobar que esto funciona perfectamente, te dejo en este enlace, la tabla de empleados. Una vez creada tu base de datos, puedes importarla desde PHPMyAdmin, o la herramienta que prefieras,, y comprobar como ambas consultas funcionan sin problemas.

     

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *