Unir dos tablas y buscar con PHP & MySQL
Unir dos tablas y buscar con PHP & MySQL. En esta ocasión nos enfocaremos en realizar búsquedas en dos tablas unidas por la sentencia INNER JOIN por defecto, y consiste en combinar y/o unificar cada fila de una tabla1 con cada fila de la otra tabla2, filtrando las filas que cumplan una determinada condición en común.
Por lo tanto, si deseamos realizar consultas en dos tablas es recomendable la utilización de la sentencias JOIN.
Unir dos tablas y buscar con PHP & MySQL
Sin embargo. Podemos utilizar la cláusula «WHERE» para usar el operador «LIKE» y poder realizar búsquedas precisas dentro de las dos tablas de acuerdo a una columna declarado en la cláusula WHERE.
Hagamos una breve explicación en el cual usaremos dos tablas una llamada «ALUMNOS» y la otra tabla llamada «CURSOS» aplicaremos una consulta en el cual explicaremos a continuación.
-
Ejemplo 01: Relacionar tablas con Inner Join
A) Tabla «Alumnos», con la clave primaria «cod»
b) Tabla «Cursos», con la clave primaria «id_curso»
Aplicamos la consulta con la sentencia INNER JOIN
SELECT nombres, ape_paterno, ape_materno FROM alumnos INNER JOIN cursos WHERE alumnos.id_curso = cursos.id_curso
Resultado Final después de realizar la consulta SQL. Si observamos veremos una tabla combinada donde hay columnas de las dos tablas relacionadas, tanto de la tabla «alumnos» como de la tabla «cursos». Esta unificación es posible gracias a la sentencia INNER JOIN.
Por lo tanto. Esta presentación hace que la información sea más relevante a la hora de tomar decisiones dentro de una organización.
2. Ejemplo 2: Buscador PHP y MYSQL usando INNER JOIN y clausula WHERE
Esta es la consulta que usaremos para este ejemplo, un poco grande pero funcional para este ejemplo de buscador INEER JOIN.
$sqln=mysqli_query($conn, "SELECT t1.id_pago, t1.monto, t1.fecha,t1.cantidad, t2.nombre_curso FROM pagos t1 INNER JOIN curso t2 ON t1.id_curso=t2.id_curso WHERE t2.nombre_curso LIKE '%$pbu%' order by t1.id_pago desc") or die(mysqli_error());
Estructura del buscador INNER JOIN completo.
Base de datos y sus Tablas
Trabajaremos en una base de datos llamada «php_union» en la cual contendrá 2 tablas, Una llamada «cursos» y otra llamada «pagos».
CREATE TABLE `curso` ( `id_curso` int(2) NOT NULL, `codcur` varchar(20) DEFAULT NULL, `nombre_curso` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `duracion` varchar(120) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; -- -- Volcado de datos para la tabla `curso` -- INSERT INTO `curso` (`id_curso`, `codcur`, `nombre_curso`, `duracion`) VALUES (1, '0001WORD', 'WORD', '3 SEMANAS'), (2, '0002EXCEL', 'EXCEL', '3 SEMANAS'), (3, '0003POWER', 'POWER POINT', '3 SEMANAS'), (4, '0004PUBLI', 'PUBLISER', '3 SEMANAS'), (5, '0005INTER', 'INTERNET', '2 SEMANAS'), (6, '0006ACCE', 'ACCESS', '4 SEMANAS'); -- -------------------------------------------------------- CREATE TABLE `pagos` ( `id_pago` int(3) NOT NULL, `id_curso` int(11) DEFAULT NULL, `monto` decimal(7,2) DEFAULT NULL, `fecha` date DEFAULT NULL, `cantidad` int(2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; -- -- Volcado de datos para la tabla `pagos` -- INSERT INTO `pagos` (`id_pago`, `id_curso`, `monto`, `fecha`, `cantidad`) VALUES (1, 1, '20.00', '2018-05-30', 1), (2, 1, '30.00', '2018-05-31', 1), (3, 2, '40.00', '2018-05-31', 1), (4, 2, '100.00', '2018-05-31', 1), (5, 3, '25.00', '2018-05-30', 1), (6, 3, '50.00', '2018-05-31', 1), (7, 4, '60.00', '2018-05-31', 1), (8, 4, '80.00', '2018-05-31', 1), (9, 5, '27.00', '2018-05-30', 1), (10, 5, '49.00', '2018-05-31', 1), (11, 6, '90.00', '2018-05-31', 1), (12, 6, '90.00', '2018-05-31', 1); -- -- Índices para tablas volcadas -- -- -- Indices de la tabla `curso` -- ALTER TABLE `curso` ADD PRIMARY KEY (`id_curso`); -- -- Indices de la tabla `pagos` -- ALTER TABLE `pagos` ADD PRIMARY KEY (`id_pago`); -- -- AUTO_INCREMENT de las tablas volcadas -- -- -- AUTO_INCREMENT de la tabla `curso` -- ALTER TABLE `curso` MODIFY `id_curso` int(2) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; -- -- AUTO_INCREMENT de la tabla `pagos` -- ALTER TABLE `pagos` MODIFY `id_pago` int(3) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
La Tabla Cursos
Tabla Pagos
Fichero conexion.php
Este será encargado de realizar la conexión con el servidor
<?php $servidor= "localhost"; $usuario= "root"; $password = ""; $nombreBD= "php_union"; ?>
Index.php
Aquí se mostrara el formulario para realizar la búsqueda y también mostrara resultados de la base de datos MySQL
<ul class="list-group"> <li class="list-group-item"> <form method="GET"> <div class="form-row align-items-center"> <div class="col-auto"> <label class="sr-only" for="inlineFormInput">Curso</label> <input name="curso" type="text" class="form-control mb-2" id="inlineFormInput" placeholder="Ingrese curso"> <input name="buscar" type="hidden" class="form-control mb-2" id="inlineFormInput" value="v"> </div> <div class="col-auto"> <button type="submit" class="btn btn-primary mb-2">Buscar Ahora</button> </div> </div> </form> </li> </ul>
El código PHP encargado de procesar la palabra clave enviada a través del formulario
<?php include('conexion.php'); $conn = new mysqli($servidor, $usuario, $password, $nombreBD); if ($conn->connect_error) { die("la conexión ha fallado: " . $conn->connect_error); } if(isset($_GET["curso"])){ $pbu=$_GET["curso"]; } if(isset($_GET["buscar"])){ $sqln=mysqli_query($conn, "SELECT t1.id_pago, t1.monto, t1.fecha,t1.cantidad, t2.nombre_curso FROM pagos t1 INNER JOIN curso t2 ON t1.id_curso=t2.id_curso WHERE t2.nombre_curso LIKE '%$pbu%' order by t1.id_pago desc") or die(mysqli_error()); } ?> <table class="table"> <thead> <tr> <th scope="col">#</th> <th scope="col">Curso</th> <th scope="col">Monto</th> <th scope="col">Cantidad</th> <th scope="col">Fecha</th> </tr> </thead> <?php if(isset($_GET["buscar"])){ $n=0; while ($dato=mysqli_fetch_array($sqln)) { $n++; echo"<tbody>"; echo"<tr>"; echo"<th scope='row'>".$n."</th>"; echo"<td>".$dato['nombre_curso']."</td>"; echo"<td>".$dato['monto']."</td>"; echo"<td>".$dato['cantidad']."</td>"; echo"<td>".$dato['fecha']."</td>"; echo"</tr>"; echo" </tbody>"; } } ?> </table>
CONCLUSIÓN
Hoy en día casi todo la información de una empresa y/o organización se almacenan en una base de datos. Sin embargo, se puede utilizar varios gestores de almacenamiento.
En este ejemplo estamos usando MySQL y lo que deseamos es optimizar los resultados a través de una consulta SQL. Por lo tanto, estamos usando la sentencia INNER JOIN para poder unir dos tablas y realizar una búsqueda precisa.
Les dejare el ejemplo completo para que puedan descargar esta pequeña muestra y que ustedes pueden modificar de acuerdo a sus necesidades.
Esta forma de realizar consultas es muy usada en la mayoría de programadores para lograr un trabajo eficiente.
Amigo buenos dias crees que con este proyecto que nos brindas lo pueda realizar con 3 tablas y no con 2 ?
solo es de agregarlo o hace falta alguna sentencia nueva? :V saludos y gracias por tus ejemplos de casualidad no tendras algo elaborado con el uso de un lector de codigos de barra 1D o 2 D pues que apenas estamos aprendiendo y no tengo idea como configurar mi scanner con php y html
Hola Luis
Si se desea agregar una tabla mas, solo debes de agregar una sentencia de INNER JOIN, ejemplo
SELECT *
FROM estados
INNER JOIN paises ON estados.pais_fk=paises.pais_pk
INNER JOIN continentes ON paises.continente_fk=continentes.continentes_pk
NOTA:
PK: Llave primaria
FK: Llave foranea
– De esta manera puedes unir las tablas
– Si no devuelve datos es porque no existen registros relacionados entre las tres tablas al mismo tiempo. Es decir, no se cumplen las condiciones.
– El INNER JOIN es estricto. Deben existir si o si registros en las tres tablas o no devolverá nada en la consulta SQL.
Buenos días Nestor. Antes que nada muchas gracias por compartir tus conocimientos con los que estamos aprendiendo. Siempre construyen un poquito más, para esclarecer dudas y nuevo conocimiento.
Quería hacerte una consulta.
Tengo un problema para mostrar los datos de dos tablas. Una tabla es de categorías (category) y otra es de publicaciones (post).
En la misma página debo mostrar primero unos botones que muestran cada categoría (y que el usuario puede editar con un CRUD) por lo tanto aparecen de acuerdo a la creación del usuario (crea la categoría y aparece el botón) y tendría que traer de allí el nombre de la categoría creada.
Y segundo, en la misma página inmediatamente abajo, por un id deben aparecer los posts de cada categoría de acuerdo al #id de cada botón. Esos post tienen información de otra tabla que los relaciona también por categoría.
Problema: Puedo mostrar las categorías en los botones a través de una función, pero al implementar la segunda función que trae los valores de la segunda tabla todo desaparece. Las funciones individualmente traen y muestran los datos correctamente. Pero no si las aplico en la misma página.
Sabes si se puede implementar alguna función para esto?
Muchas gracias de antemano!
Saludos Cordiales desde España
Mauricio Sosa
Cordial saludo
Para qué usa el cuatro de texto oculto y el calor «v»?
Lo quité y veo que hace lo mismo.
Gracias
Estimado Nestor:
Veo que eres excelente programador y, te felicito por la buena intensión de colgar en tu sitio estos excelentes tutoriales. Tengo la siguiente inquietud:
Tengo una pequeña base de datos para una biblioteca personal, compuesta por una tabla principal y 4 tablas simples relacionadas con la primera, osea, un sistema relacional. Pero, por mi desconocimiento, no se como hacer el formulario de captura, con opciones de Select, para integrar los de las otras tablas secundarias en la tabla principal. Dentro de Mysql sí se puede ver y entrar datos con dichas relaciones. Pero me falta saber como realizar el formulario de carga y el que recibe, osea, el de inserción, en pocas palabras el CRUD.
Le paso el link de la base datos: https://drive.google.com/file/d/1lkhtLWLbEYtHoFY5ZAAFML5kQWZCVBAw/view?usp=sharing
Hola Luis
Ya vi las tablas y he visto que estan relacionadas.
Ahora, si deseas integrar las tablas secundarias a la principal a travez de un select o varios select
Aquí te dejo un articulo de como recuperar datos de una tabla dependiente a un select
https://www.baulphp.com/llenar-select-html-con-mysql-php-ejemplos/
De ese select solo debes de guardar la id de la tabla secundaria y almacenarlo en la tabla principal llamada documentos.
Espero que esto te ayude, caso contrario puedes hacer mas consultas.
amigo en donde haces la consulta para buscar la informacion en la base de datos
t1 y t2 a que hacen referencia, es que ya trate de agregar mis valores de mi tabla y me marca error precisamente en esa lina donde empieza la consulta sql
Hola ricardo,
t1 y t2 son alias que se le asignan a las tablas con el fin de minimizar las consultas por ejemplo:
La tabla Pago se llamara o hace referencia a t1
La tabla curso se llamara o hace referencia a t2
Y esos nombres se llaman en la consulta para usar el inner Join
Espero haber despejado tus dudas.