Foros del Web » Programando para Internet » PHP »

realizar select * dentro del count

Estas en el tema de realizar select * dentro del count en el foro de PHP en Foros del Web. hola, tengo el siguiente problema, resulta que necesito saber cuantos elementos se han asignado de cada tipo, hago un select count por cada elemento, para ...
  #1 (permalink)  
Antiguo 08/10/2010, 09:36
Avatar de blonder413  
Fecha de Ingreso: octubre-2010
Mensajes: 58
Antigüedad: 14 años, 2 meses
Puntos: 0
Pregunta realizar select * dentro del count

hola, tengo el siguiente problema, resulta que necesito saber cuantos elementos se han asignado de cada tipo, hago un select count por cada elemento, para ello uso un ciclo en php para pasar el nombre del elemento, de esta manera resulta un vector con la cantidad de cada elemento.

luego de esto grafico solo aquellos que la cantidad es mayor q 0 y le pongo el label correspondiente.

la pregunta es?

como hago para traer los nombres de esos elementos y listarlos en una tabla por ejemplo.

anexo el codigo correspondiente al grafico

Código:
<?php
	require_once("jpgraph\src\jpgraph.php");
	require_once("jpgraph\src\jpgraph_bar.php");
	require_once("conexion.php");

//******* GUARDAR LOS NOMBRES DE LOS ELEMENTOS EN UN VECTOR **********

$sql = "SELECT * FROM elementos";
$res = mysql_query($sql,$con);
$i=0;

while($row = mysql_fetch_assoc($res)){
$vector[$i] = $row['nombre'];	//guardo los nombres de los elementos en un arreglo
$i++;
}

//*****************************************************************
$c=0;
for($f=0;$f<$i;$f++){
	$sql = "SELECT * FROM `entregasdiarias` WHERE material LIKE '%".$vector[$f]."%'";	//busco cada elemento
	$res = mysql_query($sql,$con);
	if(mysql_num_rows($res)>0){		//verifico que exista algún elemento
		$row = mysql_num_rows($res);	//determino la cantidad
		$datay[$c] = $row;	//almaceno cada resultado en un arreglo
		$c++;
	}
}

mysql_close($con);

//****************************************************

#crear la grafica haciendo 2 llamadas que siempre van a ser requeridas
$graph = new Graph($c*200,$c*80); //dimensiones ancho,alto
//$graph = new Graph(4000,1000);
$graph->SetScale('textlin');

$graph->SetShadow();	//adherir sombra

#margenes
$graph->SetMargin(50,20,20,50);	//izq, der, sup, inf

$bplot = new Barplot($datay);	//crear la barra
$bplot->SetLegend ("Asignación Total por elemento");	//leyenda

$bplot->SetColor('blue');	//color del borde de las barras
$bplot->SetFillColor('yellow');	//color del relleno de las barras
$graph->Add($bplot);	//añadimos el bplot a la grafica

#configurar los titulos
$graph->title->Set("Cantidad de elementos asignados");	//titulo del grafico
$graph->xaxis->title->Set('Elementos');		//titulo para el eje x
$graph->yaxis->title->Set('Cantidad');		//titulo para el eje y

#etiqueta para cada elemento del eje x
$graph->xaxis->SetTickLabels($vector);

$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->SetFont(FF_FONT1,FS_BOLD);

$graph->stroke();	//mostrar la grafica

?>
  #2 (permalink)  
Antiguo 08/10/2010, 09:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: realizar select * dentro del count

Contar diferentes elementos identificados por su ID, y poner la cantidad de cada tipo junto con su descripción o nombre:
Código MySQL:
Ver original
  1. SELECT COUNT(idelemento) TotalElementos, NombreElementos
  2. FROM elementos
  3. GROUP BY idelemento;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 08/10/2010, 13:00
Avatar de blonder413  
Fecha de Ingreso: octubre-2010
Mensajes: 58
Antigüedad: 14 años, 2 meses
Puntos: 0
Pregunta Respuesta: realizar select * dentro del count

gracias, ese codigo solo me muestra la lista de elementos, y como esta contando el id muestra 1 en cada campo de cantidad. lo que yo necesito es contar la tabla entregasdiarias.

tengo este codigo que me cuenta la cantidad de cada uno:

NOTA: en vector[] almaceno el nombre de todos los elementos


$c=0;
for($f=0;$f<$i;$f++){
$sql = "SELECT * FROM `entregasdiarias` WHERE material LIKE '%".$vector[$f]."%'"; //busco cada elemento
$res = mysql_query($sql,$con);
if(mysql_num_rows($res)>0){ //verifico que exista algún elemento
$row = mysql_num_rows($res); //determino la cantidad
$datay[$c] = $row; //almaceno cada resultado en un arreglo
$c++;
}
}


en la variable "datay" guardo la cantidad por cada elemento, pero quiero tambien almacenar el nombre (solo de aquellos que hayan sido asignados al menos una vez). por ejemplo:

elementos("uniforme","guante","casco","gafas","bot as");

uniforme: 0
guante: 1
casco: 15
gafas: 9
botas: 0

vector=("guante", "casco", "gafas");

y asi imprimir este vector en una tabla o algo asi.
  #4 (permalink)  
Antiguo 08/10/2010, 13:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: realizar select * dentro del count

Cita:
racias, ese codigo solo me muestra la lista de elementos, y como esta contando el id muestra 1 en cada campo de cantidad. lo que yo necesito es contar la tabla entregasdiarias.
El esquema es el mismo. Lo que cambia es la tabla. Razónalo en base a lo que te pasé y obtendrás la respuesta rápidamente.

TE doy un sólo tip:
Código MySQL:
Ver original
  1. SELECT  Nombre, COUNT(id) Total
  2. FROM `entregasdiarias`
  3. GROUP BY  Nombre;


P.D.: No pongas código de programación (sea PHP, ASP, o lo que sea), para ello hay foros específicos. Este es Bases de Datos y las normas del mismo no permiten eso, porque resulta incomprensible para quienes trabajamos específicamente con SQL o bien con otros lenguajes.

Función de la sección de Base de Datos
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 08/10/2010, 13:15
Avatar de blonder413  
Fecha de Ingreso: octubre-2010
Mensajes: 58
Antigüedad: 14 años, 2 meses
Puntos: 0
De acuerdo

creo que la consulta seria algo asi

SELECT COUNT( * ) TotalElementos, elementos.nombre
FROM entregasdiarias
INNER JOIN elementos
WHERE entregasdiarias.material LIKE '%Uniforme%'
GROUP BY cedula

solo me queda almacenar los datos en un vector a ver como queda, pero creo q voy a preguntar en el foro de php, tiene razon eso no va acá.

gracias, si ves algun error me avisas por favor

hola, resulta que necesito hacer un conteo de los elementos asignados entre determinadas fechas, el codigo que he hecho me muestra los elementos, pero con otro nombre y cantidad, como es una combinación de mysql y php no se donde tenga el error, si la consulta esta bien pasaré al foro de php por lo demás, si alguien puede resolverme completamente el problema sería mucho mejor. gracias

$a=0;
$c=0;
for($f=0;$f<$i;$f++){
$sql = "SELECT COUNT( * ) TotalElementos, elementos.nombre
FROM entregasdiarias
INNER JOIN elementos
WHERE entregasdiarias.material LIKE '%".$vector[$f]."%'
AND (fecha BETWEEN '".$fecha1."' AND '".$fecha2."')
GROUP BY cedula
"; //busco cada elemento entre dos fechas específicas

$res = mysql_query($sql,$con);
$row=mysql_num_rows($res);
if($row>0){ //verifico que exista algún elemento
$datay[$c] = $row; //determino la cantidad y almaceno cada resultado en un arreglo
$datos[$c]=$vector[$a]; //almaceno el nombre del elemento en un vector
$c++;
}

$a++;
} //cierre for

Última edición por GatorV; 13/10/2010 a las 09:08
  #6 (permalink)  
Antiguo 13/10/2010, 07:44
 
Fecha de Ingreso: abril-2010
Mensajes: 23
Antigüedad: 14 años, 7 meses
Puntos: 3
Sonrisa Respuesta: consulta count usando between

Hola!

No lo he mirado a fondo, pero si tu consulta es:

Código SQL:
Ver original
  1. SELECT COUNT( * ) TotalElementos, elementos.nombre
  2. FROM entregasdiarias
  3. INNER JOIN elementos
  4. WHERE entregasdiarias.material LIKE '%".$vector[$f]."%'
  5. AND (fecha BETWEEN '".$fecha1."' AND '".$fecha2."')
  6. GROUP BY cedula

veo algo que es "posible" que esté mal, si haces un inner join de dos tablas y no pones una condicion,

Es decir, en vez de FROM entregasdiarias
INNER JOIN elementos --> poner: FROM entregasdiarias
INNER JOIN elementos ON elementos.algo=entregasdiarias.algo

te va a sacar la multipiclacion exponencial de los registros de una por la de otra, es decir, si tienes dos tablas decentes, una consulta de la muerte :P.

por experiencia, yo cambiaria el BETWEEN por

fecha_tal>'fecha_inferior' AND fecha_tal<'fecha_superior'

mucho más efectivo para las estadísticas del mysql
  #7 (permalink)  
Antiguo 13/10/2010, 08:07
Avatar de blonder413  
Fecha de Ingreso: octubre-2010
Mensajes: 58
Antigüedad: 14 años, 2 meses
Puntos: 0
Pregunta

gracias meix, pero creo que la bd esta mal relacionada, a ver que opinas, esta es la consulta que hice

SELECT COUNT( * ) TotalElementos, elementos.nombre FROM entregasdiarias
INNER JOIN elementos ON entregasdiarias.codigo = elementos.codigo
WHERE entregasdiarias.material LIKE '%Botas Moto%'
AND (fecha > 'fecha1' AND fecha < 'fecha2')
GROUP BY cedula

el campo entregasdiarias.codigo no existe, elementos.codigo es int, ¿necesito cambiarlo a varchar y agregar entregasdiarias.codigo?

Una idea de lo que tengo

elementos
cod nombre
1 botas
2 uniforme
3 casco

entregasdiarias
cc material
10156212 botas
15698563 botas, casco

creo que el problema era el inner join, es que necesito sacar los nombres de los materiales, pero bueno por ahora se que funciona así que lo voy a dejar asi mientras tanto

SELECT COUNT( * )
FROM entregasdiarias
WHERE entregasdiarias.material LIKE '%Botas Moto%'
AND (fecha >= '2010/10/11' AND fecha <= '2010/10/12')

Última edición por GatorV; 13/10/2010 a las 09:08
  #8 (permalink)  
Antiguo 13/10/2010, 08:53
Avatar de blonder413  
Fecha de Ingreso: octubre-2010
Mensajes: 58
Antigüedad: 14 años, 2 meses
Puntos: 0
Pregunta guardar una consulta sql en un array

hola, resulta que estoy haciendo un conteo de cantidad de materiales de todos los elementos de una tabla, quisiera saber como guardo ese resultado en un vector y su nombre en otro, pero solo para los elementos que existan, es decir, que el resultado de la consulta sea > 0. este es el codigo que tengo.

Código:
$c=0;
for($f=0;$f<$i;$f++){
$sql = "SELECT COUNT( * ) 
FROM entregasdiarias
WHERE entregasdiarias.material LIKE '%".$elementos[$f]."%'
AND (fecha >= '%".$fecha1."%' AND fecha <= '%".$fecha2."%')
";	//busco cada elemento entre dos fechas específicas

	$res = mysql_query($sql,$con);
	$row=mysql_num_rows($res);	//devuelve el numero de filas
	if($row>0){		//verifico que exista algún elemento
		$datay[$c] = $row;	//determino la cantidad y almaceno cada resultado en un arreglo
		$datos[$c]=$elementos[$f];	//almaceno el nombre del elemento en un vector
		$c++;
	}
	
}	//cierre for
  #9 (permalink)  
Antiguo 13/10/2010, 09:03
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: guardar una consulta sql en un array

Cita:
Iniciado por blonder413 Ver Mensaje
hola, resulta que estoy haciendo un conteo de cantidad de materiales de todos los elementos de una tabla, quisiera saber como guardo ese resultado en un vector y su nombre en otro, pero solo para los elementos que existan, es decir, que el resultado de la consulta sea > 0. este es el codigo que tengo.

Código:
$c=0;
for($f=0;$f<$i;$f++){
$sql = "SELECT COUNT( * ) 
FROM entregasdiarias
WHERE entregasdiarias.material LIKE '%".$elementos[$f]."%'
AND (fecha >= '%".$fecha1."%' AND fecha <= '%".$fecha2."%')
";	//busco cada elemento entre dos fechas específicas

	$res = mysql_query($sql,$con);
	$row=mysql_num_rows($res);	//devuelve el numero de filas
	if($row>0){		//verifico que exista algún elemento
		$datay[$c] = $row;	//determino la cantidad y almaceno cada resultado en un arreglo
		$datos[$c]=$elementos[$f];	//almaceno el nombre del elemento en un vector
		$c++;
	}
	
}	//cierre for
podría jurar que ya vi este tema hace días...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 13/10/2010, 09:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Tema movido desde Mysql a PHP

Etiquetas: consultasmysql, graficos, php+mssql, php-mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:05.