Genesis Vargas J

Sumar filas de una columna, agruparlas y limitar la consulta a cierta cantidad en MySQL con PHP Orientado a Objetos

Comparte:

Hola amigos, en esta ocasión les mostraré como sumar filas de una columna de nuestra tabla, agruparlas por clasificación (por ejemplo, por proveedores) y limitar esa consulta en un numero de registros en MySQLy PHP orientado a objetos.

Para este tutorial vamos a hacer un ejemplo con un inventario que va a tener una base de datos llamada producto que tendrá 2 tablas: una llamada inventario y la otra proveedor (el script de la base de datos esta en la carpeta comprimida descargable junto con los demás archivos); además este ejemplo consta de 5 archivos: el script producto.sql, una hoja de estilo css, un archivo conexion.php para conectarnos a la base de datos, un archivo clases.php donde tendremos la clase producto y un archivo index.php donde mostraremos la consulta.

INDEX.PHP

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Top 3 Proveedores con mas productos</title>
<link rel="stylesheet" href="estilo.css">
</head>
<body>
    <div class="contendor">
        <div id="tabla">
            <h1>Sumar filas de una columna, agruparlas y limitar la consulta a cierta cantidad en MySQL con PHP Orientado a Objetos - http://www.genesisvargasj.com</h1><hr>
            <table>
            <thead>
                <tr>
                    <th>Proovedor</th>
                    <th>Total Productos</th>
                </tr>
            </thead>
            <tbody>
            <?php
            $total = 0;
            require_once 'Clases.php';
            $producto = new Producto();
            $datos = $producto->CantidadProductosProveedores();
            for($i=0; $i<sizeof($datos); $i++)
            {
                echo '<tr><td>'.$datos[$i]["Proveedor"].'</td><td>'.$datos[$i]["Cantidad"].'</td></tr>';
                $total = $total + $datos[$i]["Cantidad"];                            
            }
            ?>
                <tr><td>TOTAL:</td><td><?php echo $total; ?></td></tr>
            </tbody>
        </table>
    </div>
  </body>
</html> 

Aquí creamos una pagina php con su estructura normal de HTML y en la tabla escribimos el codigo php para recorrer y mostrar los registro; para eso requerimos el archivo clases.php y creamos un objeto de la clase producto y en la variable datos le asignamos el array que nos devuelve la funcion CantidadProductosProveedores en el for imprimimos los registros de ese array y la tabla se llenara fila por fila hasta el limite de la consulta que es 3.

CLASES.PHP

<?php
require("Conexion.php");  
class Producto  
{    

    private $_products;  

    public function __construct()    
    {
        $this->_products = array();    
    }
    
    public function CantidadProductosProveedores()
    {
        $sql = "SELECT p.NombreProveedor AS Proveedor, sum(i.Cantidad) AS Cantidad FROM proveedor p, inventario i WHERE p.IdProveedor = i.IdProveedor GROUP BY p.IdProveedor ORDER BY p.NombreProveedor DESC LIMIT 3";
        $result = mysqli_query(Conexion::Conectar(), $sql);
        while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
        {
            $this->_products[] = $row;
        }
        return $this->_products ;
    }
}
?> 

Aquí requerimos el archivo conexion.php para conectarnos a la base de datos y creamos una clase llamada producto y en ella creamos una variable privada y en el constructor le indicamos que sera un array, por último creamos una funcion que devolvera ese array y que es la que utilizamos en la pagina index.php. La consulta sql va a agrupar (clasificar) los registros de los productos por el proveedor que tengan entonces simplemente se cruzan las dos tablas que tienen relación: proveedor - inventario y el campo que comparten es la condicion: IdProveedor; a lo ultimo de la consulta le colocamos ORDER BY p.NombreProveedor DESC LIMIT 3 para que esa consulta la ordene por el nombe del proveedor y un limite de 3 es decir los 3 ultimos proveedores en orden alfabetico.

CONEXION.PHP

<?php
class Conexion
{
	public static function Conectar()
	{
		$con = new mysqli("localhost", "root", "", "radio");
		if ($con->connect_errno)
		{
			exit();
		}
		@mysqli_query($con, "SET NAMES 'utf8'");
		return $con;
	}
}
?>

Aquí creamos una funcion publica para conectarnos a nuestra base de datos.

ESTILO.CSS

 
body {
	background: #f2f2f2;
	color: #111;
	font-family: sans-serif;
	font-size: 14px;
}

.contenedor {
	width: 980px;
	margin: 0 auto;	
	padding: 2em;	
}

#tabla {
	padding: 18px 20px;	
	text-align:center;
}

table {
	cursor: pointer;
	padding:8px;
	width: 100%;
}

th {
	background: rgb(66, 159, 202); 
	border-color: rgb(66, 159, 202);
}

tr, td {
	border: 1px solid rgb(66, 159, 202);
	border-radius: 5px;
}

@media screen and (max-width: 1024px) {
 
    .contenedor {
		width:100%;
    }
    
    #tabla {
		padding: 1em;	
		float:left;
		width:90%;
	}
}

Y por último creamos este archivo para darle un toque de estilo a nuestra tabla donde se mostraran los registros.

Al final este sería el resultado:

Bueno eso es todo espero que les sirva mucho para aprender y practicar. les dejo una carpeta comprimida para que descarguen el ejemplo y también un demo para que lo vean en funcionamiento.

DEMO

Comentarios


genesis vargas

Soy Genesis Vargas Jiménez, autor de éste blog. Me gusta desarrollar software en todas las plataformas (web, móvil y desktop) y compartir conocimiento para ayudar a muchas personas.

Desde el 2015 soy MVP Microsoft en Visual Studio y tecnologías de desarrollo, reconocimiento que me enorgullece mucho.

MVP Genesis Vargas J

A PHP Error was encountered

Severity: Core Warning

Message: Module 'timezonedb' already loaded

Filename: Unknown

Line Number: 0

Backtrace: