Unir dos tablas con información correspondiente [SOLUCIONADO]

Combinar Registros de Diferentes Tablas en PHP y MySQL

La funcionalidad para combinar datos de dos tablas dentro de una base de datos MySQL es una operación frecuente y esencial en el desarrollo de aplicaciones con PHP. La habilidad para realizar consultas que involucren múltiples tablas e interrelacionar su información es fundamental para cualquier desarrollador web.

Técnicas de Unión de Tablas en SQL

Para lograr la unión de informaciones procedentes de distintas tablas, utilizamos sentencias específicas de SQL conocidas como JOIN. Existiendo diferentes tipos de JOIN, cada uno se adecua mejor a distintos escenarios según la necesidad de los datos que deseamos obtener. Veamos a continuación los tipos más comunes de JOIN en SQL:

  • INNER JOIN: Recupera registros cuando hay al menos una coincidencia en ambas tablas.
  • LEFT (OUTER) JOIN: Recupera todos los registros de la tabla izquierda y aquellos con coincidencia de la tabla derecha.
  • RIGHT (OUTER) JOIN: Recupera todos los registros de la tabla derecha y aquellos con coincidencia de la tabla izquierda.
  • FULL JOIN: Recupera registros cuando hay una coincidencia en una de las tablas.

Ejemplo Práctico de INNER JOIN con PHP y MySQL

Imaginemos que tenemos dos tablas: una de usuarios y otra de pedidos. Queremos obtener una lista de pedidos junto con la información del usuario que realizó cada pedido. Para ello, podemos utilizar un INNER JOIN que relacione correctamente las dos tabas.

<?php
$con = new mysqli("localhost", "mi_usuario", "mi_contraseña", "mi_bd");

$sql = "SELECT usuarios.nombre, pedidos.id_pedido, pedidos.fecha 
        FROM usuarios 
        INNER JOIN pedidos ON usuarios.id_usuario = pedidos.id_usuario";

$result = $con->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Nombre: " . $row["nombre"]. " - ID Pedido: " . $row["id_pedido"]. " - Fecha: " . $row["fecha"]. "<br>";
    }
} else {
    echo "0 resultados";
}
$con->close();
?>

LEFT JOIN y RIGHT JOIN: Comprender las Diferencias

Cuando queremos recuperar todos los registros de una tabla y sólo los coincidentes de la otra, aplicamos LEFT JOIN o RIGHT JOIN. La elección entre uno u otro dependerá de la tabla de la cual queremos recuperar todos los datos.

Supongamos que deseamos recuperar todos los usuarios, independientemente de si han realizado pedidos o no, pero si la información del pedido está disponible, también queremos verla. En este escenario, un LEFT JOIN sería la sentencia adecuada:

<?php
$con = new mysqli("localhost", "mi_usuario", "mi_contraseña", "mi_bd");

$sql = "SELECT usuarios.nombre, pedidos.id_pedido, pedidos.fecha 
        FROM usuarios 
        LEFT JOIN pedidos ON usuarios.id_usuario = pedidos.id_usuario";

$result = $con->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Nombre: " . $row["nombre"]. " - ID Pedido: " . (isset($row["id_pedido"]) ? $row["id_pedido"] : "Sin Pedido"). " - Fecha: " . (isset($row["fecha"]) ? $row["fecha"] : "No Disponible"). "<br>";
    }
} else {
    echo "0 resultados";
}
$con->close();
?>

Por otro lado, si nos interesara obtener todos los pedidos, incluso aquellos sin un usuario asociado, usaríamos un RIGHT JOIN, invirtiendo las tablas en nuestra consulta:

<?php
$con = new mysqli("localhost", "mi_usuario", "mi_contraseña", "mi_bd");

$sql = "SELECT usuarios.nombre, pedidos.id_pedido, pedidos.fecha 
        FROM pedidos 
        RIGHT JOIN usuarios ON usuarios.id_usuario = pedidos.id_usuario";

$result = $con->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Nombre: " . (isset($row["nombre"]) ? $row["nombre"] : "Usuario Desconocido") . " - ID Pedido: " . $row["id_pedido"]. " - Fecha: " . $row["fecha"]. "<br>";
    }
} else {
    echo "0 resultados";
}
$con->close();
?>

Uniendo Tres o Más Tablas

En ocasiones, es necesario interconectar más de dos tablas. Supongamos que ahora contamos con una tercera tabla llamada “productos” y queremos relacionar los usuarios con los pedidos y, adicionalmente, con los productos. Para ello, podríamos escribir algo como esto:

<?php
$con = new mysqli("localhost", "mi_usuario", "mi_contraseña", "mi_bd");

$sql = "SELECT usuarios.nombre AS nombre_usuario, pedidos.id_pedido, productos.nombre AS nombre_producto, pedidos.fecha 
        FROM usuarios 
        INNER JOIN pedidos ON usuarios.id_usuario = pedidos.id_usuario 
        INNER JOIN productos ON pedidos.id_producto = productos.id_producto";

$result = $con->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Usuario: " . $row["nombre_usuario"]. " - ID Pedido: " . $row["id_pedido"]. " - Producto: " . $row["nombre_producto"]. " - Fecha: " . $row["fecha"]. "<br>";
    }
} else {
    echo "0 resultados";
}
$con->close();
?>

Optimización y Buenas Prácticas

Al trabajar con múltiples uniones de tablas, es importante prestar atención al rendimiento. Asegúrate de utilizar índices en las columnas que sirven como vínculo entre las tablas (por ejemplo, id_usuario, id_pedido, etc.) para agilizar las consultas.

Asimismo, es recomendable filtrar los datos de manera eficiente, utilizando cláusulas como WHERE y aplicando lógicas de selección que descarten registros innecesarios lo antes posible durante la ejecución de la consulta.

Finalmente, es una buena práctica cerrar la conexión con la base de datos una vez que hayamos finalizado de realizar las operaciones necesarias. De esta manera, nos aseguramos de liberar recursos del sistema y evitamos posibles problemas de concurrencia en nuestro servidor.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad