Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marcelobbt

Contagem de valores por tipo

Recommended Posts

Onde estou errando?

Quero fazer uma contagem de quantos registros tenho de cada tipo, mas ele está me retornando o valor total de registros para todos os tipos.

 

<?php
	include "../config_bd.php";
	
	ini_set('max_execution_time', 600);
	$max = 200;
	$i =1;
	$qtd1 = $qtd2 = 0;
	$tipoterreno = $recurso1 = $recurso2 = $X = $Y = $imagem = 0;
	$idmax = 0;
	
	$sql = "SELECT * FROM mapa";
	$query = mysql_query($sql);
	while($sql = mysql_fetch_array($query)) {
		$id = $sql["ID"];
		$x = $sql["X"];
		$y = $sql["Y"];
		$tipoterreno = $sql["Tipoterreno"];
		$recurso1 = $sql["Recurso1"];
		$qtd1 = $sql["Qtd1"];
		$recurso2 = $sql["Recurso2"];
		$qtd2 = $sql["Qtd2"];
		$idusuario = $sql["IDusuario"];
		$imagem = $sql["Imagem"];
		$idmax ++;
		if ($tipoterreno = "montanha") {
			$montanha = $montanha +1;
		} else {
			$planicie = $planicie +1;
		}
		if ($Recurso1 = "floresta") {
			$floresta = $floresta +1;
		} 
		if ($Recurso1 = "pedra") {
			$pedra = $pedra +1;
		}
		if ($Recurso2 = "ouro") {
			$ouro = $ouro +1;
		} 
		if ($Recurso2 = "barro") {
			$barro = $barro +1;
		}

	}
	echo "<P><b>Totais:</b></p>";
	echo "Quantidade de montanhas: ",$montanha,"<br>";
	echo "Quantidade de pedras: ",$pedra,"<br>";
	echo "Quantidade de ouro: ", $ouro,"<br>";
	echo "---------------------------<br>";
	echo "Quantidade de planícies: ", $planicie,"<br>";
	echo "Quantidade de florestas: ", $floresta,"<br>";
	echo "Quantidade de barros: ", $barro,"<br>";
	echo $idmax,"---------------------------<br>";
	
 ?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso você resolve a nível de BD, manda um COUNT com GROUP BY pela coluna da tabela e pronto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela dica. Acabei fazendo algo parecido que resolveu.

 

Segue abaixo:

$sql = "SELECT * FROM mapa WHERE Tipoterreno = 'montanha'";
$query = mysql_query($sql);
$montanha = mysql_num_rows($query);

Compartilhar este post


Link para o post
Compartilhar em outros sites

quais os campos que deseja contar por tipo, de um exemplo ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O exemplo está nesse meu segundo post.

 

no campo Tipoterreno eu conto os que são montanhas e depois faço outra query para contar quantos são planicies.

 

Fiz da forma que postei no post #3 e funcionou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O exemplo está nesse meu segundo post.

 

no campo Tipoterreno eu conto os que são montanhas e depois faço outra query para contar quantos são planicies.

 

Fiz da forma que postei no post #3 e funcionou.

não prescisa criar outra query, pode fazer em apenas uma e assim fica mais rapido e sem gambiarra

 

$sql  = "SELECT ";
$sql .= "(SELECT COUNT(*) FROM mapa WHERE Tipoterreno = 'montanha') as qtd_montanha,";
$sql .= "(SELECT COUNT(*) FROM mapa WHERE Tipoterreno = 'planicies') as qtd_planicies";
$query = mysql_query($sql);
$montanha = mysql_num_rows($query);

Compartilhar este post


Link para o post
Compartilhar em outros sites

não prescisa criar outra query, pode fazer em apenas uma e assim fica mais rapido e sem gambiarra

 

Mais rápido? Cuidado... subquerys nem de longe são opções para ganho de desempenho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Mais rápido? Cuidado... subquerys nem de longe são opções para ganho de desempenho.

eu não estou fazendo uma subquery.

 

estou em uma mesma query subselects

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu não estou fazendo uma subquery.

 

estou em uma mesma query subselects

Meu Deus.. quando eu penso que já li tudo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu Deus.. quando eu penso que já li tudo...

 

 

que eu saiba sub querys seria se tive-se usando assim

 

$sql1 .= "SELECT COUNT(*) FROM mapa WHERE Tipoterreno = 'montanha'";
$query1 = mysql_query($sql1);
$result1 = mysql_num_rows($query1);


$sql2 .= "SELECT COUNT(*) FROM mapa WHERE Tipoterreno = 'planicies'";
$query2 = mysql_query($sql2);
$result2 = mysql_num_rows($query2);

 

 

eo exemplo que dei foi

 

 

$sql  = "SELECT ";
$sql .= "(SELECT COUNT(*) FROM mapa WHERE Tipoterreno = 'montanha') as qtd_montanha,";
$sql .= "(SELECT COUNT(*) FROM mapa WHERE Tipoterreno = 'planicies') as qtd_planicies";
$query = mysql_query($sql);
$result = mysql_num_rows($query);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com Group By (como sugerido anteriormente)

 

$sql = 'SELECT Tipoterreno, COUNT(*) as total FROM mapa GROUP BY 1';
$rs = $pdo->query($sql);

while($row = $rs->fetch(PDO::FETCH_ASSOC)) {
   print_r($row);
}

@erison

 

Acho melhor você dar uma estudadinha :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

certo, mais me referir a função mysql_query do php, não a do banco de dados.

 

e do modo que você fez @hufersil, não vai da certo para o dono deste post, por que não e apenas 1 tipo e sim 2 tipo.

por isso que fiz 2 selects.

 

e no meu ponto de vista e mais rápido você usar 2 select em uma unica consulta do que fazer 2 count usando 2x mysql_query.

 

 

leia o que @marcelobbt escreveu no post #5.

Compartilhar este post


Link para o post
Compartilhar em outros sites

certo, mais me referir a função mysql_query do php, não a do banco de dados.

 

e do modo que você fez @hufersil, não vai da certo para o dono deste post, por que não e apenas 1 tipo e sim 2 tipo.

por isso que fiz 2 selects.

 

e no meu ponto de vista e mais rápido você usar 2 select em uma unica consulta do que fazer 2 count usando 2x mysql_query.

 

 

leia o que @marcelobbt escreveu no post #5.

O problema é que o seu ponto de vista difere do que se vê na prática... já tive caso de consulta com subquery que chegava a estourar o timeout do servidor (milhares de linhas em cada tabela), quado fazia a consulta separada tudo funcionava like a charm, ai entra a questão: é bonito? Não, mas funciona. Veja que subquery em geral já vem de uma certa falha na modelagem do BD (atenção para as as palavras "em geral" e "certa"), pois isso não é algo de comum entre as tabelas (join), nem algo do tipo, é apenas retornar um certo resultado "juntado" em um consulta qualquer.

 

Sobre o COUNT/GROUP BY, é óbvio que vai funcionar, basta aplicar do jeito correto, se está tudo na mesma coluna "Tipoterreno", basta agrupar e contar, igual o citado no outro post, isso sim é o modo gambiless.

 

Mas é bom ressaltar que esse nosso brainstorm acaba sendo útil para todo mundo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e do modo que você fez @hufersil, não vai da certo para o dono deste post, por que não e apenas 1 tipo e sim 2 tipo.

por isso que fiz 2 selects.

 

 

macaco+pensador.jpg

 

CREATE TABLE evento (
  id INTEGER NOT NULL AUTO_INCREMENT,
  data_evento DATE,
  descricao VARCHAR(100),
  PRIMARY KEY(id)
);

INSERT INTO evento (data_evento, descricao) VALUES 
('2013-12-01', 'Primeiro Evento'),
('2013-12-01', 'Segundo Evento'),
('2013-12-01', 'Terceiro Evento'),
('2013-12-05', 'Quarto Evento'),
('2013-12-05', 'Quinto Evento'),
('2013-12-21', 'Sexto Evento');

mysql> SELECT DATE_FORMAT(data_evento,'%d/%m/%Y') as data, COUNT(*) FROM evento GROUP BY 1;
+------------+----------+
| data       | COUNT(*) |
+------------+----------+
| 01/12/2013 |        3 |
| 05/12/2013 |        2 |
| 21/12/2013 |        1 |
+------------+----------+
3 rows in set (0.01 sec)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

macaco+pensador.jpg

 

CREATE TABLE evento (
  id INTEGER NOT NULL AUTO_INCREMENT,
  data_evento DATE,
  descricao VARCHAR(100),
  PRIMARY KEY(id)
);

INSERT INTO evento (data_evento, descricao) VALUES 
('2013-12-01', 'Primeiro Evento'),
('2013-12-01', 'Segundo Evento'),
('2013-12-01', 'Terceiro Evento'),
('2013-12-05', 'Quarto Evento'),
('2013-12-05', 'Quinto Evento'),
('2013-12-21', 'Sexto Evento');

mysql> SELECT DATE_FORMAT(data_evento,'%d/%m/%Y') as data, COUNT(*) FROM evento GROUP BY 1;
+------------+----------+
| data       | COUNT(*) |
+------------+----------+
| 01/12/2013 |        3 |
| 05/12/2013 |        2 |
| 21/12/2013 |        1 |
+------------+----------+
3 rows in set (0.01 sec)

 

 

certo, mais volto a repetir leia o #5

 

o que ele quer fazer e como se tive-se

 

('2013-12-01', 'Primeiro Evento'),
('2013-12-01', 'Segundo Evento'),
('2013-12-01', 'Terceiro Evento'),
('2013-12-05', 'Quarto Evento'),
('2013-12-05', 'Quinto Evento'),
('2013-12-21', 'Primeiro Evento');

ai vem , como faz para saber a quantidade de quantas datas e eventos iguais?

 

tipo:
01/12/2013 = 3
Primeiro Evento = 2

 

esse ao problema dele, tem 2 count na mesma tabela.

antes de criticar tente realmente dar uma solução para o dono do post !

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

esse ao problema dele, tem 2 count na mesma tabela.

antes de criticar tente realmente dar uma solução para o dono do post !

Dois counts?

 

http://stackoverflow.com/questions/2421388/using-group-by-on-multiple-columns

 

Compre um bom livro de SQL... porque francamente isso dai é o básico do básico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, vamos lá.

 

study.jpg

 

Post #5

 

O exemplo está nesse meu segundo post.

 

no campo Tipoterreno eu conto os que são montanhas e depois faço outra query para contar quantos são planicies.

 

Fiz da forma que postei no post #3 e funcionou.

 

Ora, se o cara já tá dizendo que tem que fazer uma consulta para o que é montanha, e outra para o que não é montanha, o group by resolve sim. Desta forma (com group by), trará em cada linha do resultset o tipo de terreno encontrado e suas respectivas quantidades. Veja que ele faz o select usando WHERE no post 3, que vai dar na mesma coisa que o group by, exceto que o group by com count é mais inteligente e vai trazer TODOS os tipos de terreno e suas quantidades em uma consulta só, ao invés de seguir sua linha de raciocínio e fazer (!?) uma consulta para cada tipo de terreno.

 

Agora, se ele quer pegar tudo que não é "montanha" e jogar numa coisa só (ao invés de ter tudo separadinho bonitinho), é fácil também.

 

CREATE TABLE mapa (
  id INTEGER NOT NULL AUTO_INCREMENT,
  tipoterreno VARCHAR(100),
  recurso1 VARCHAR(100),
  qtd1 INTEGER,
  recurso2 VARCHAR(100),
  qtd2 INTEGER,
  PRIMARY KEY(id)
);

INSERT INTO mapa (tipoterreno,recurso1,qtd1,recurso2,qtd2) VALUES 
  ("MONTANHA","FLORESTA",1,"OURO",10),
  ("MONTANHA","FLORESTA",1,"PRATA",5),
  ("MONTANHA","FLORESTA",1,"COBRE",7),
  ("PLANICIE","PEDRA",1,"BARRO",7),
  ("PLANICIE","PEDRA",10,"OURO",70),
  ("VILA","PEDRA",10,"OURO",70);
  

  
mysql> SELECT tipoterreno, COUNT(*) AS total_tipo_terreno FROM mapa GROUP BY 1;
+-------------+--------------------+
| tipoterreno | total_tipo_terreno |
+-------------+--------------------+
| MONTANHA    |                  3 |
| PLANICIE    |                  2 |
| VILA        |                  1 |
+-------------+--------------------+
3 rows in set (0.02 sec)

mysql> SELECT IF(tipoterreno = "MONTANHA",tipoterreno,"OUTROS") as tipo, COUNT(*) as total FROM mapa GROUP BY 1;
+----------+-------+
| tipo     | total |
+----------+-------+
| MONTANHA |     3 |
| OUTROS   |     3 |
+----------+-------+
2 rows in set (0.00 sec)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uau, quanta informação. Obrigado pelas dicas de todos. Só não precisam se exaltar. Já entendi que pode ser feito de várias formas, umas melhore que a outra, mas o importante é ter o resultado.

 

Mais uma vez agradeço pelo debate. Com certeza poderá vir a ser muito útil em outras ocasiões.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.