Uniendo tablas MySQL (y IV). Uniones con más de dos tablas.

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Para finalizar con esta serie de artículos vamos a ver una situación muy habitual, que se da en muchísimos desarrollos. Se trata de relacionar datos de dos tablas, a través de una tercera tabla intermedia, que contiene las referencias a los elementos de cada una de las tablas principales, en la típica relación de “muchos a muchos”, también llamada de m-n. Es el caso en que cada elemento de la tabla A puede estar relacionado con uno o más elementos de la tabla B, y recíprocamente. De hecho, este es el caso más habitual cuando dos tablas se relacionan entre sí. También puede ser, conceptualmente, el más complejo de entender cuando uno se inicia en SQL. Este artículo nos enseñará cómo efectuar estas consultas.

EL ESCENARIO

Vamos a partir de una base de datos que relaciona usuarios con provincias (en un artículo anterior de esta serie ya usamos un simil parecido) sólo que, en esta ocasión, en lugar de indicar la provincia en la que reside el usuario, se indican las provincias en las que ha residido a lo largo de su vida. Puede ser una sola, o pueden ser varias. Por lo tanto, tenemos que un usuario puede estar relacionado con varias provincias, y también que una misma provincia puede estar relacionada con varios usuarios, ya que pueden ser varios los que residan, o hayan residido alguna vez, en dicha provincia. Es el típico escenario de muchos a muchos, que requiere de una tabla intermedia donde se reflejen los ids de los usuarios, y los ids de las provincias en que estos han residido. Al final de este artículo tienes una base de datos con las tres tablas cargadas para hacer pruebas.

LA CONSULTA CLÁSICA

Sin el uso de joins, la consulta para saber en que provincias ha residido cada usuario podría ser algo similar a esto:

Si la pruebas en PHPMyAdmin, verás que te da los resultados correctos, indicándote, para cada usuario, todas las provincias relacionadas con cada usuario.

 

COMBINACIONES

En lugar de usar una consulta tradicional (que lo que hace, realmente, es emular una combinación subyacente) podemos usar abiertamente la combinación adecuada, cómo ves a continuación:

Fíjate en la parte resaltada, donde tenemos dos combinaciones de tipo INNER JOIN: una para combinar adecuadamente cada tabla de datos con la tabla intermedia que las relaciona.

CONSIDERACIONES

Cuando hacemos consultas de tipo muchos a muchos, lo normal es que los datos de la tabla que podríamos llamar primaria (en este ejemplo, la de usuarios) aparezcan repetidos. Es lógico porque la consulta nos va a devolver una fila, no por cada usuario, sino por cada relación que un usuario tenga con una provincia, es decir, por cada provincia en la que ha residido el usuario. Si, por ejemplo, el usuario 1 ha residido en tres provincias, la consulta nos devolverá tres filas del usuario 1. En SQL no existe una forma de obtener, directamente a partir de la consulta, una sola fila por usuario con los nombres de todas las provincias en las que ha residido. Para eso tenemos que recurrir a manipular el resultado con código, como se ve en el ejemplo unir_3_tablas.php:

Observa, en las líneas resaltadas, como agrupamos las provincias que corresponden a cada usuario. Si el usuario es nuevo, lo incluimos en la matriz de resultados, con una submatriz de provincias. Si ya existe, le añadimos la provincia recién leída.

En este enlace tienes la base de datos y el script para hacer tus pruebas.

     

Deja un comentario

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