Lenguaje PHPMYSQL La base de datos

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.

  1. Ejemplo 01: Relacionar tablas con Inner Join

A) Tabla «Alumnos», con la clave primaria «cod»

tabla alumnos inner join
Tabla alumnos inner join

b) Tabla «Cursos», con la clave primaria «id_curso»

"<yoastmark

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.

Resultado consulta inner join
Resultado consulta inner join

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

"<yoastmark

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>
Unir dos tablas y buscar con PHP & MySQL
Unir dos tablas y buscar con PHP & MySQL

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.

DESCARGA

Descargar Código Fuente

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

8 comentarios

  1. 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

    1. 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.

  2. 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

  3. 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

    1. 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.

  4. 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

    1. 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.

Deja una respuesta

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

Botón volver arriba