Optimizar las consultas SQL en PHP: Select y Join

by Janeth Kent Date: 10-06-2019 php sql consultas basededatos bd

La mayoría de nosotros tiene que relacionarse con bases de datos en nuestros proyectos, y SQL es uno de los languajes más utlizados.
SQL (Structured Query Language) es un lenguaje de programación estándar e interactivo para la obtención de información desde una base de datos.

Las consultas toman la forma de un lenguaje de comandos que permite seleccionar, insertar, actualizar, averiguar la ubicación de los datos, y más. También hay una interfaz de programación. Sin embargo, trabajar con SQL en PHP puede ser complicado. Si sus consultas son complejas, tiene que codificarlas como cadenas de texto que pueden ser propensas a errores, y que sufren de problemas de formato.

Hoy os guiaremos a través de la escritura de largas y confusas consultas Select and Join con PHP. Para ayudarnos, utilizaremos el ejemplo proporcionado por Davison que podéis descargar aquí:

 

Descarga el código del proyecto


Todo lo que tenéis que hacer es copiar y pegar este archivo PHP y guardarlo en vuestro proyecto. El archivo contiene una clase PHP DbQuery con varios métodos/funciones.

Analizemos el contenido.

La clase DbQuery è un generador de queries que nos ayuda a crear consultas SQL. Por ejemplo:

$sql = new DbQuery();
$sql->select('*');
$sql->from('item', 'i');
$sql->where('i.item_id > 1');
$sql->where('i.item_id > 3');
$sql->orderBy('i.item_id');
$sql->limit(5, 10);

echo $sql;

De este código saldrá:


 SELECT * FROM item i WHERE ( i.item_id > 1 ) AND ( i.category_id > 3 ) ORDER BY i.item_id LIMIT 10, 5
  

Métodos principales

__toString() – Generar y obtener la consulta.

build() – Generar y obtener la consulta (devolver un string, cadena de carácteres).

from(string $table, mixed $alias = null) – Define una tabla desde la cláusola FROM .

groupBy(string $fields) – Añade una restricción GROUP BY.

having(string $restriction) – Añade una restricción en la cláusola HAVING (cada restricción estará separada por un AND).

innerJoin(string $table, string $alias = null, string $on = null) – Añade una cláusola INNER JOIN

E.g. $this->innerJoin('product p ON ...').

join(string $join) – Añade una cláusola JOIN

E.g. $this->join('RIGHT JOIN'.DB_PREFIX.'product p ON ...');.

leftJoin(string $table, string $alias = null, string $on = null) – Añade una cláusola LEFT JOIN.

leftOuterJoin(string $table, string $alias = null, string $on = null) – Añade una cláusola LEFT OUTER JOIN.

limit(string $limit, mixed $offset = 0) – Límita los resultados de una consulta.

naturalJoin(string $table, string $alias = null) – Añade una cláusola NATURAL JOIN.

orderBy(string $fields) –Añade una restricción ORDER BY.

select(string $fields) – Agregar campos en la consulta.

where(string $restriction) –Añade una restricción WHERE (cada restricción estará separada por un AND).

A continuación mostreremos algunos ejemplos de cómo utilizar el generador de consultas SQL. Primero empezaremos por conectarnos a nuestra base de datos. Tenéis que tener en cuenta que la constante DB_PREFIX debe estar incluida en el fichero, ya que es necesaria en la clase DbQuery.

require_once dirname(_FILE_) . '/db-query.php';

define( 'DB_HOST', 'localhost' );
define( 'DB_USER', 'root' );
define( 'DB_PASSWORD', 'password' );
define( 'DB_NAME', 'sql_builder' );

/** Must include this constant in your script since it's used by the DbQuery class */
define( 'DB_PREFIX', '' );

error_reporting(E_ALL); 
ini_set('display_errors', 1);

// Create connection
$conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

 

Tenéis que pegar todo el código de abajo después de la sección anterior.

Vamos a escribir algunos códigos de ejemplo y haremos un "echo" de la consulta SQL.

SELECT y ORDER BY

 

$sql = new DbQuery();
$sql->select('*');
$sql->from('item', 'i');
$sql->orderBy('i.item_id');

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

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        print_r($row);
    }
}
SELECT * FROM item i ORDER BY i.item_id

WHERE, OR y LIMIT

$sql = new DbQuery();
$sql->select('*');
$sql->from('item', 'i');
$sql->where('i.item_id = 3 OR i.item_id = 5');
$sql->orderBy('i.item_id');
$sql->limit(5, 10);

 

SELECT * FROM product p WHERE (p.category_id = 3 OR p.category_id = 5) ORDER BY p.product_id LIMIT 10, 5

COUNT y GROUP BY

$sql = new DbQuery();
$sql->select('COUNT(category_id) AS cat_sum, category_id');
$sql->from('product');
$sql->groupBy('category_id');

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

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        print_r($row);
    }
}
SELECT COUNT(category_id) AS cat_sum, category_id FROM product GROUP BY category_id

INNER JOIN

/** 
 * Sql Joins
 * INNER JOIN: devuelve las filas cuando hay una coincidencia en ambas tablas.
 * LEFT JOIN: devuelve todas las filas de la tabla de la izquierda, incluso si no hay coincidencias en la tabla de la derecha.
 * RIGHT JOIN: devuelve todas las filas de la tabla derecha, incluso si no hay coincidencias en la tabla izquierda.
 **/
$sql = new DbQuery();
$sql->select('i.item_id, i.name AS item_name, c.name');
$sql->from('item', 'i');
$sql->innerJoin('category', 'c', 'i.category_id = c.category_id');

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

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        print_r($row);
    }
}

SELECT i.tem_id, i.name AS item_name, c.name FROM item i INNER JOIN category c ON i.category_id = c.category_id

GROUP BY

 

$sql = new DbQuery();
$sql->select('COUNT(i.item_id) AS item_sum, i.category_id');
$sql->from('item', 'i');
$sql->having('COUNT(i.category_id) > 5');
$sql->groupBy('category_id');

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

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        print_r($row);
    }
}
SELECT COUNT(i.item_id) AS item_sum, i.item_id FROM item i GROUP BY category_id HAVING (COUNT(i.item_id) > 5)

 

Y eso es todo por hoy. Gracias por leer! Si os gustan los artículos como este, dejad un comentario y compartidlo en las redes.

Feliz desarrollo

 
by Janeth Kent Date: 10-06-2019 php sql consultas basededatos bd visitas : 10797  
 
Janeth Kent

Janeth Kent

Licenciada en Bellas Artes y programadora por pasión. Cuando tengo un rato retoco fotos, edito vídeos y diseño cosas. El resto del tiempo escribo en MA-NO WEB DESIGN AND DEVELOPMENT.

 
 
 

Artículos relacionados

Guía para enviar Facturas Electrónicas a Agencia Tributaria Española con PHP

En este artículo, te explicaremos paso a paso cómo comunicarte con el servicio XML de Hacienda Española para enviar facturas electrónicas utilizando PHP. Este enfoque es ideal para empresas o…

Novedades de PHP 8.4: Un Salto Evolutivo para el Desarrollo Web

PHP sigue siendo uno de los lenguajes de programación más utilizados para el desarrollo web, y con cada versión nueva, el lenguaje se adapta a las necesidades modernas de los…

Cómo configurar PHP en Caddy Server

Caddy Server es una plataforma de servidor web modular y moderna que soporta certificados HTTPS automáticos, QUIC y HTTP/2, compresión Zstd y Brotli, y varias características modernas, así como características…

Guía Básica: Cómo Integrar una Base de Datos ArangoDB con PHP

ArangoDB es una base de datos multi-modelo que ofrece una combinación poderosa de características de base de datos documental, de grafos y de clave-valor. Su flexibilidad y rendimiento la convierten…

Seguimiento en tiempo real de los vuelos: la API de Flight Tracker

La API de Flight Tracker brinda a los desarrolladores la capacidad de acceder al estado de los vuelos en tiempo real, lo cual resulta extremadamente útil para integrar un seguimiento…

Ejecución de funciones PHP en AWS Lambda y API Gateway

¿Qué es AWS Lambda? AWS Lambda es un servicio de procesamiento sin servidor que puede ejecutar código en respuesta a eventos o condiciones predeterminados y administrar automáticamente todos los recursos de…

Cómo enviar un correo electrónico desde un formulario de contacto HTML

En el artículo de hoy vamos a escribir sobre cómo hacer un formulario que funcione y que al pulsar ese botón de envío sea funcional y envíe el correo electrónico…

6 Formas de leer archivos en PHP, con strings, array y más

Bienvenido a un tutorial sobre cómo leer archivos en PHP. Sí, así es, ¿qué tan difícil puede ser leer archivos en PHP? Se sorprenderá... No es tan sencillo como algunos…

Instalar Laravel Homestead en Windows 10

Instalar Homestead Mediante Vagrant Laravel Homestead es una máquina virtual que viene ya preparada para el desarrollo de proyectos con Laravel y otras tecnologías de PHP . Al ser una máquina…

Cookies HTTP: cómo funcionan y cómo usarlas

Hoy vamos a escribir sobre la forma de almacenar datos en un navegador, por qué los sitios web utilizan cookies y cómo funcionan en detalle. Continúa leyendo para averiguar cómo implementarlas…

PHP 8.0: mas rápido que nunca con el compilador JIT

Probablemente ya habéis oido la noticia hace unos meses de que el compilador JIT será agregado a PHP 8. Ya desde PHP 7.0, se han hecho cambios para mejorar el…

Guía sencilla para convertir imágenes a WebP en PHP

El 30 de septiembre de 2010, Google anunció la publicación de un nuevo estándar abierto para la compresión con pérdida de gráficos de 24 bits en la web. La base…