Nueva pregunta

Pregunta:

Fecha: 19-10-2015 10:23:15 (En Español)

Consultas MySQL y PHP[Resuelta]

Buenas comunidad una consulta, tengo que hacer un ABM para un trabajo practico y me gustaria hacer una estadistica partiendo de una tabla de un DB. Ejemplo de cuantos productos hay en total, ect.

Esta sería la consulta para crear la tabla insumo

CREATE TABLE IF NOT EXISTS `insumo` (
  `id_insumo` int(10) unsigned NOT NULL,
  `tipo_insumo` enum('Material','Herramienta') NOT NULL,
  `nom_insumo` varchar(32) NOT NULL,
  `descripcion_insumo` tinytext,
  `cant_insumo` float NOT NULL,
  `unidad_medida` enum('Metro','Kilogramo','Litro','Unidad') NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


Crear dos registros

INSERT INTO `insumo` (`id_insumo`, `tipo_insumo`, `nom_insumo`, `descripcion_insumo`, `cant_insumo`, `unidad_medida`) VALUES
(1, 'Herramienta', 'Taladro', NULL, 5, 'Unidad'),
(2, 'Material', 'Lapiz', NULL, 5, 'Unidad');


Aclaro que no estan enseñando POO, asi que es todo programación estructurada.

require('db_connect.php');

$consulta = Array();

$consulta[0] = 'SELECT COUNT(id_insumo) FROM insumo';
$consulta[1] = 'SELECT COUNT(tipo_insumo) FROM insumo WHERE tipo_insumo = "Material"';
$consulta[2] = 'SELECT COUNT(tipo_insumo) FROM insumo WHERE tipo_insumo = "Herramienta"';

foreach($consulta as $valor) {
   $ssql[] = mysqli_query($conexion, $valor);
}

for($i = 0; $i < count($ssql); $i++) {
   $reg[] = mysqli_fetch_array($ssql[$i], MYSQLI_NUM);
}

foreach($reg as $indice) {
   foreach($indice as $valor) {
      echo $valor.'<br/>';
   }
}


Bien paso a explicar mi código, creo un array llamado consulta que le paso un string con el nombre la consulta hacer, despues con un foreach recorro ese array y por cada vuelta guardo en otro array la referencia del select. Despues recorro el array donde tengo ese referencia de ese select para que me muestre los datos.

Pienso yo que estoy haciendo un espagueti de código :S, saben como poder optimizar esto sin usar programación orientada a objetos.

¡Saludos y gracias desde ya!
Etiquetas: MySQL - PHP - Pregunta Votos: 1 - Respuestas: 14 - Vistas: 15 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 19-10-2015 13:01:41 Hola gente me parece que ya encontre un puntita para resolver mi problema

    Multi Query

    Estoy haciendo algunas pruebas y esta funcionando.

    ¡Saludos!
      Votos: 1 - Link respuesta
     
  • Fecha: 19-10-2015 14:11:25 Gonzalo:

    Buenas tarde;
    Si no interprete mal lo que querias, es obtener la Estadistica o Porcentaje de Cada Insumo.
    Lo he resuelto de este modo, lo probe y funciona correctamente, solo debes reemplazar la conexion.
    El script esta documentado.
    Te dejo el Script:

    <?php 
    
    /**
     * Reemplaza tu conexion por la mia 
     */
    require('funciones/conexion.php'); 
    
    /**
     * Obtengo la Cantidad total de Insumos 
     */
    $sql = "SELECT * 
    		FROM insumo		 
    		";
    
    $result = $mysqli->query($sql); 
    
    $numero = mysqli_num_rows($result);  
    $cantidad_de_productos = $numero;	
    
    /**
     * Obtengo la Cantidad total de Materiales 
     */
    $sql = "SELECT * 
    		FROM insumo
    		WHERE tipo_insumo = 'Material'
    		";
    
    $result = $mysqli->query($sql); 
    
    $numero = mysqli_num_rows($result);  
    $cantidad_de_materiales = $numero;
    
    /**
     * Obtengo la Cantidad total de Herramientas 
     */
    $sql = "SELECT * 
    		FROM insumo
    		WHERE tipo_insumo = 'Herramienta'
    		";
    
    $result = $mysqli->query($sql); 
    
    $numero = mysqli_num_rows($result);
    $cantidad_de_herramientas = $numero;
    
    /**
     * Imprimo los resultados individuales 
     */
    echo "CANTIDADES TOTALES DE CADA UNO" ."<hr>";
    
    echo "Cantidad de Productos:   " .$cantidad_de_productos    ."<br>"; 
    echo "Cantidad de Materiales:  " .$cantidad_de_materiales   ."<br>"; 
    echo "Cantidad de Herramientas:" .$cantidad_de_herramientas ."<hr>"; 
    
    /**
     * Obtengo la estadistica o % de cada insumo
     */
    echo "LOS % DE CADA PRODUCTO O ESTADISTICA" ."<hr>";
    
    $procentaje_de_materiales   = ($cantidad_de_materiales / $cantidad_de_productos)   * 100;
    $procentaje_de_herramientas = ($cantidad_de_herramientas / $cantidad_de_productos) * 100;
    
    echo "% de Materiales:   " .$procentaje_de_materiales   ." % <br>"; 
    echo "% de Herramientas: " .$procentaje_de_herramientas ."% <br>"; 
    
    ?>
    

    Un saludo
    DC
      Votos: 0 - Link respuesta
     
  • Fecha: 19-10-2015 14:21:58 Gracias por tu respuesta Daniel, voy agregar esos de los porcentajes :)

    Yo investigando un poco lo hize de esta forma

    <?php
    require('db_connect.php');
    
    $stats = array('Empleado:', 'Stock:', 'Material:', 'Herramienta:', 'Cantidad Pedido:');
    $n = 0;
    
    $query = 'SELECT COUNT(id_empleado) FROM empleado; ';
    $query .= 'SELECT COUNT(id_insumo) FROM insumo; ';
    $query .= 'SELECT COUNT(tipo_insumo) FROM insumo WHERE tipo_insumo = "Material"; ';
    $query .= 'SELECT COUNT(tipo_insumo) FROM insumo WHERE tipo_insumo = "Herramienta"; ';
    $query .= 'SELECT COUNT(id_retiro) FROM retiro;';
    echo '<ul>';
    if(mysqli_multi_query($conexion, $query)) {
       do {
          if($result = mysqli_store_result($conexion)) {
             while($row = mysqli_fetch_row($result)) {
                echo '<li>'.$stats[$n].' '.$row[0].'</li>';
                $n+=1;
             }
             mysqli_free_result($result);
          }
       }while(mysqli_next_result($conexion));
    }
    echo '</ul>';
    ?>
    
      Votos: 1 - Link respuesta
     
  • Fecha: 19-10-2015 15:27:18 Gonzalo

    Me parece que con tu script como esta no vas a poder obtener los porcentaje, ya que no podrias tener el total de los insumos de ese array debito a que tenes 2 WHERE (Condiciones).
    De esa forma al no obtener el total de insumos de la consulta te va a ser dificil calcular los porcentajes de participacion de los materiales y herramientas, al menos que generes otra consulta adicional.
    Por otra parte he observado que consultas 2 tablas mas (Empleado y Retiro) , que no estaban en la consulta original de tu pregunta, como asi tampoco subiste las tablas respectivas (Ver pregunta original)
    Un saludo
    DC
      Votos: 1 - Link respuesta
     
  • Fecha: 19-10-2015 15:51:17 Desconozco quien voto desfavorable mi respuesta en el script que publique ...
    Lo que me gustaria saber es ¿Porque?, ya que el script funiona PERFECTAMENTE y cumple con lo solicitado.
    En consecuencia, espero una respuesta con la documentacion que acredite lo contrario.

    Un saludo
    Daniel Calofatti
      Votos: 0 - Link respuesta
     
  • Fecha: 19-10-2015 18:48:39 Me parece que con tu script como esta no vas a poder obtener los porcentaje, ya que no podrias tener el total de los insumos de ese array debito a que tenes 2 WHERE (Condiciones).

    Asi es tenes razon, despues de que me pasaste tu script me fui a cenar y a pensar un poco con mi script lo que hago es pisar siempre el valor que tiene $row[0], El tema de las otras tablas no te la pase ya que es una para calcular el total de empleados y los retiros que se han hecho. Era solo para que se entendiera la idea.

    Desconozco quien voto desfavorable mi respuesta en el script que publique ...
    Lo que me gustaria saber es ¿Porque?, ya que el script funiona PERFECTAMENTE y cumple con lo solicitado.
    En consecuencia, espero una respuesta con la documentacion que acredite lo contrario.


    De mi parte no fue.

    Un saludo y muchas gracias por compartir tu conocimiento.

    Gonzalo Herrera.-
      Votos: 0 - Link respuesta
     
  • Fecha: 20-10-2015 02:35:50 Gonzalo
    Descarte que fuiste vos en primera instancia.
    Uno puee mal interpretar una pregunta y uno muchas veces comete errores en apreciasiones, dado a que por algun motivo la pregunta no fue correctamente formulada y desconoce con presicion que es lo que esta haciendo el otro, no en vano Fernando muchas veces he leido que indica que las preguntas deben ser bien realizadas para que los demas puedan ayudarlo (No fue tu caso).
    Interprete tu pregunta, la desarrolle, la probe, la documente y expuse el script.
    Posteriormente lei tu respuesta, y adverti sobre la imposibilidad de obtener el resultado pretendido en el script, respondiendome de tu parte con una afirmacion a mi respuesta.
    Lo extraño es que magicamente, desaparecio mi voto negativo y te paso a explicar que es lo que pasa.
    Hay gente en el foro que VOTA COMPULSIVAMENTE, no lee ni le importa si esta mal o bien las cosas, hasta puedo pensar que pretendio votar positivamente y en el apuro, voto negativo por error.
    He advertido en al dia de ayer que he tenido 2 votos por distintas preguntas en las cuales hay menos de 1 minuto en cada uno ... esta claro que voto sin leer previamente o si leyo lo hizo a alta velocidad de lectura y comprension de texto.
    Todo este comentario que te hago, es simplemente un comentario, entiendo que Fernando Mosquera (Quien administra este foro), ya esta tomando medidas y el sabe perfectamente de quien fue esta maniobra.
    Te mando un saludo, me alegro que te ayudo mi script y como siempre aqui estoy dispuesto para una ayuda, si es que puedo resolverla.

    Daniel Calofatti
    PD.: Si entendes que la pregunta fue resuleta, es conveniente que la cierres, pasandola a RESUELTA
      Votos: 0 - Link respuesta
     
  • Fecha: 20-10-2015 05:22:39 Para esos tipos de consulta se acostumbra hacer un GROUP BY , no hacer consulta por separado ya que si mas adelante aumenta una nuevo tipo de insumo deberian ingresar al codigo fuente y aumentar mas linea de programacion con respesto a ese nuevo insumo , para lo cual se utiliza la clausula GROUP BY expongo el codigo

     <?php 
        /**
         * Reemplaza tu conexion por la mia 
         */
        require('funciones/conexion.php'); 
        /**
         * Obtengo la Cantidad total de Insumos 
         */
        $sql = "SELECT *  FROM insumo ";
        $result = $mysqli->query($sql); 
        $cantidad_de_productos = mysqli_num_rows($result);  
      
         /* Obtengo las cantidades */
        $sql = "SELECT tipo_insumo, COUNT(*) AS 'cantidad' FROM insumo GROUP BY tipo_insumo";
        
    	$result = $mysqli->query($sql); 
    	while ($row =mysqli_fetch_array($result,MYSQLI_ASSOC)){
    	/**
    	* Imprimo los resultados individuales 
    	*/
    	echo "CANTIDADES TOTALES DE CADA UNO" ."<hr>";
    	echo "Cantidad de ".$row["tipo_insumo"] . " : ".$row["cantidad"] ."<br/>";
    	/**
    	* Obtengo la estadistica o % de cada insumo
    	*/
    	echo "% de ".$row["tipo_insumo"]." : ". ($row["cantidad"] / $cantidad_de_productos)*100;
    
    	}
     ?>
    


    Saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 20-10-2015 06:12:46 Juan
    Es otra forma:

    2 Correcciones:
    a) En la linea 17 falta cerrar un parentecis, sino no funciona
    b) No reportas el total de insumos ... Faltaria ... echo $cantidad_de_productos;
    Un saludo
    DC
      Votos: 0 - Link respuesta
     
  • Fecha: 20-10-2015 06:41:04 Daniel

    el punto b esta en la linea
    11 $cantidad_de_productos = mysqli_num_rows($result);

    y sobre la linea 17 tienes razon se me paso un parentesis .

    gracias por la observacion.

    con mi publicacion quize darle a entender que para esos tipo de reportes de debe hacer con group by y no con consultas separadas expuse en el post anterior el porque no hacer consultas idependientes

    no hacer consulta por separado ya que si mas adelante aumenta una nuevo tipo de insumo deberian ingresar al codigo fuente y aumentar mas linea de programacion con respesto a ese nuevo insumo

    saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 20-10-2015 06:52:46 la forma que tu planteas no quiere decir q esta mal , pero no cumple con el objetivo fundamental que es que un modulo corra por si solo la forma que tu planteas cada vez que se agregue un insumo se deberá ingresar al codigo fuente e añadir las nuevas lineas
    
    /**
     * Obtengo la Cantidad total de Materiales 
     */
    $sql = "SELECT * 
            FROM insumo
            WHERE tipo_insumo = 'Material'
            ";
    $result = $mysqli->query($sql); 
    $numero = mysqli_num_rows($result);  
    $cantidad_de_materiales = $numero;
    /**
     * Obtengo la Cantidad total de Herramientas 
     */
    $sql = "SELECT * 
            FROM insumo
            WHERE tipo_insumo = 'Herramienta'
            ";
    $result = $mysqli->query($sql); 
    $numero = mysqli_num_rows($result);
    $cantidad_de_herramientas = $numero;
    
    
    


    imaginemos que mas adelante aumnete un insumo que se llame material_consumubles

    entonces tendria que ingresar al achivo y agregar esta linea

    /**
     * Obtengo la Cantidad total de  material_consumubles 
     */
    $sql = "SELECT * 
            FROM insumo
            WHERE tipo_insumo = 'material_consumubles'
            ";
    $result = $mysqli->query($sql); 
    $numero = mysqli_num_rows($result);
    $cantidad_de_herramientas = $numero;
    
    



    para evitar esto se utiliza la clausula group by

     $sql = "SELECT tipo_insumo, COUNT(*) AS 'cantidad' FROM insumo GROUP BY tipo_insumo";
    
      Votos: 5 - Link respuesta
     
  • Fecha: 20-10-2015 07:06:23 Juan

    Es correcta tu apresiacion
    DC
      Votos: 0 - Link respuesta
     
  • Fecha: 20-10-2015 08:13:21 Juan muchas gracias por tu aporte, lo probe y funciona ala perfección.

    Marco como solucionado.

    ¡Saludos!
      Votos: 0 - Link respuesta
     
  • Fecha: 20-10-2015 08:28:34 Que bueno que te sirvio Gonzalo saludos! , tener en cuenta que para esos tipos de mostrar totales es recomendable utilizar el group by   Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com