Ir para conteúdo

POWERED BY:

Arquivado

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

Fábio Penna

Como contar E Mostrar 10 Campos Com Mais Valores Iguais

Recommended Posts

Olá Pessoal!

 

Estou com um grande problema, e espero que alguém possa me ajudar.

 

Eu utilizo PHP e tenho um bando de dados MYSQL com uma tabela específica, onde nesta tabela tenho mais de 100 campos.

Em todos estes campos, pode ter valores A, B, D, F.

 

Eu preciso mostrar os nomes dos 10 campos que mais tem valores F e a quantidade de valores F tem em cada um destes 10 campos.

 

Estou tentando alguma coisa tipo:

select count(distinct *) from laudos_caminhao where * = 'F'

 

Só que não da certo. Alguém sabe como me ajudar a partir disto também?

 

 

Preciso com urgência de uma ajuda.

 

Qualquer dúvida, me perguntem.

 

Obrigado,

Fábio Penna

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha amigo, tenho que reconhecer que não sei fazer isso que você quer...

 

Mas recomendo que faça o seguinte...

 

(Não sei se vai funcionar...)

 

$colunas = array();
$query = mysql_query("SELECT * FROM <tabela>");
while ($result = mysql_fetch_assoc($query)) { 
foreach ($result as $coluna=>$valor) {
if (!isset($colunas[$coluna]))
$colunas[$coluna] = $valor;
else
$colunas[$coluna] .= $valor;
}
}
/*
echo "<pre>";
print_r($colunas);
echo "</pre>";
*/

$totais = array();
$buscar = 'F';
foreach ($colunas as $col=>$valores) {
$totais[$col] = substr_count($valores, $buscar);
}
rsort($totais);
$n = 1;
foreach ($totais as $coluna=>$valores) {
echo "A {$n}ª coluna que mais tem '{$buscar}' é a coluna {$coluna}";
if ($n++ > 10)
break;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha amigo, tenho que reconhecer que não sei fazer isso que você quer...

 

Mas recomendo que faça o seguinte...

 

(Não sei se vai funcionar...)

 

$colunas = array();
$query = mysql_query("SELECT * FROM <tabela>");
while ($result = mysql_fetch_assoc($query)) { 
foreach ($result as $coluna=>$valor) {
if (!isset($colunas[$coluna]))
$colunas[$coluna] = $valor;
else
$colunas[$coluna] .= $valor;
}
}
/*
echo "<pre>";
print_r($colunas);
echo "</pre>";
*/

$totais = array();
$buscar = 'F';
foreach ($colunas as $col=>$valores) {
$totais[$col] = substr_count($valores, $buscar);
}
rsort($totais);
$n = 1;
foreach ($totais as $coluna=>$valores) {
echo "A {$n}ª coluna que mais tem '{$buscar}' é a coluna {$coluna}";
if ($n++ > 10)
break;
}

Olá amigo, muito obrigado pela ajuda.

Fiz um teste, e ele está me dando o seguinte resultado:

 

A 1ª coluna que mais tem 'F' é a coluna 0

A 2ª coluna que mais tem 'F' é a coluna 1

A 3ª coluna que mais tem 'F' é a coluna 2

A 4ª coluna que mais tem 'F' é a coluna 3

A 5ª coluna que mais tem 'F' é a coluna 4

A 6ª coluna que mais tem 'F' é a coluna 5

A 7ª coluna que mais tem 'F' é a coluna 6

A 8ª coluna que mais tem 'F' é a coluna 7

A 9ª coluna que mais tem 'F' é a coluna 8

A 10ª coluna que mais tem 'F' é a coluna 9

A 11ª coluna que mais tem 'F' é a coluna 10

 

O resultado não está certo, mas acho q esse é o caminho.

 

Será que tem como ele me da o nome da coluna ao invés de o número dela?

Pois preciso do nome, e não o número dela.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ali onde tem:

/*
echo "<pre>";
print_r($colunas);
echo "</pre>";
*/

Troca por:

echo "<pre>";
print_r($colunas);
echo "</pre>";
exit(0);

E me diz como tá o array que vai ser exibido...

Compartilhar este post


Link para o post
Compartilhar em outros sites

tu vai precisar fazer um store procedure,

primeiro tu faz um select para contar quantas letras F tem em cada campo

 

select
sum(case when campo1 like '%F%' then 1 else 0 end) c1,
sum(case when campo2 like '%F%' then 1 else 0 end) c2,
sum(case when campo3 like '%F%' then 1 else 0 end) c3,
....
from tabela

tu vai fazer o número de campos que você tem.

você pode gravar o resultado do select num vetor e verifica quais são os dez maiores valores

 

se o maior valor estiver na posição 77, você sabe que o campo é o campo77, tranquilo

 

aí você lista nome dos campos,

boa sorte

é trabalhoso mas não é difícil

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ali onde tem:

/*
echo "<pre>";
print_r($colunas);
echo "</pre>";
*/

Troca por:

echo "<pre>";
print_r($colunas);
echo "</pre>";
exit(0);

E me diz como tá o array que vai ser exibido...

O resultado foi o seguinte:

Array
(
	[id] => 1234567891011121314
	[macaco] => bbbbbbbbFbbbbb
	[estrangulador] => bbbbbbbbbbbbbb
	[estepe] => babbbbbbbabbba
	[comotador] => babbaabbbbabbb
	[triangulo] => bbbbbbbbbbFFbb
	[bomba_injetora] => bbbbbbbbbbbbbb
	[chave_roda] => bbbbbbbbbbbbbb
	[rolamento_centro] => bbFFFbbbbbbbba
	[extintor] => bbbbbbbbbbbbbb
	[suporte_barra_curta] => babbbbFbbbbbbb
	[cinto] => bbbbbbbbbbbbbb
	[estabilizador_dianteiro] => babbbbbaabbaaa
	[farois_dianteiros] => bbbbbbbbbbbbbb
	[estabilizador_traseiro] => bbbbbbbaabbbba
	[lanternas_traseiras] => babbbbbbbbbbab
	[grampo_carroceria] => bbbbbbbbbbbbba
	[lanternas_setas] => babbbbbbbbbbbb
	[guarda_po_transmissao] => bbbbFFbbbbbbbb
	[painel_instrumentos] => bbbbbbbbbbbbbb
	[feixe_molas_dianteiro] => bbbbabbaababba
	[limpador_parabrisa] => bbbbbbbbbbFbbb
	[feixe_molas_traseiro] => bbbbabbbbbabbb
	[carrocaria] => bbbbbbbbbbbbbb
	[amortecedores_dianteiros] => bbFFbbabbbbbba
	[bascula] => bbbbbbbbbbbbbb
	[amortecedores_traseiros] => bbbbbbFbbbFabb
	[chassi2] => bbbbbbbbbbbbbb
	[setor_direcao] => bbbbbbbbbbaaba
	[parachoque_dianteiro] => bbabbbbbbbabbb
	[freios_dianteiros] => bbbabbabbbabba
	[parachoque_traseiro] => bbabbbbbbbabba
	[freios_traseiros] => bbbabbaaabbbbb
	[reservatorio_ar] => bbbbbbbbbbbbbb
	[embreagem] => bbbbbbbbbbbbbb
	[volante_direcao] => bbbbbbbbbbabbb
	[motor] => baabbbbbbbbbaa
	[cruzeta_rolamento] => bbbbbbFbbbabba
	[caixa_marchas] => bbbbbbbbbbbbba
	[revisao_cardan] => bbbbbbbbbbbbbb
	[diferencial] => bbbbbbbbbbbbba
	[manga_eixo] => bbbbbbabbbbbbb
	[tanque_combustivel] => bbbbbbbbbbbbba
	[rolamento_roda_dianteira] => bbbbbbbbbbbbbb
	[tambores_freio] => bbbbbbbbFFbbbb
	[rolamento_roda_traseira] => bbbbbbbbbbbbbb
	[rolamento_roda] => bbbbbbFbbbbbbb
	[tensores] => babbbbbbbbbbba
	[rodas_dianteiras] => bbbbbbbbbbbFbb
	[escape] => babbbbbbbbbbba
	[tomada_forca] => 
	[rodas_traseiras] => babbbbbbbbbbbb
	[ponteira_barra_curta] => bbbbbbbbbbbbbb
	[pneus_dianteiros] => babbbbbbbbbbbb
	[ponteira_barra_longa] => bbbbbbbbbbabba
	[pneus_traseiros] => bbabbbbbbbbbbb
	[bau_embreagem] => bbbbbbbbbbFbbb
	[parabrisa_dianteiro] => bbbbbbbbbbbbbb
	[cinta_seg_transmissao] => bbbbbbbbbbbbbb
	[parabrisa_traseiro] => bbbbbbbbbbbbbb
	[eixo_s] => bbbbbbbbbbbabb
	[janela_emergencia] => bbbbbbbbbbbbbb
	[banco_passageiros] => bbbbFbbbbbabba
	[tacografo] => babbbbbbbbbbbb
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código correto:

$colunas = array();
$query = mysql_query("SELECT * FROM <tabela>");
while ($result = mysql_fetch_assoc($query)) {
foreach ($result as $coluna=>$valor) {
if (!isset($colunas[$coluna]))
$colunas[$coluna] = strtoupper($valor);
else
$colunas[$coluna] .= strtoupper($valor);
}
}
/*
echo "<pre>";
print_r($colunas);
echo "</pre>";
exit(0);
*/
unset($colunas['id']);
$totais = array();
$buscar = 'F';
foreach ($colunas as $col=>$valores) {
$totais[$col] = substr_count($valores, $buscar);
}
rsort($totais);
$n = 1;
foreach ($totais as $coluna=>$valores) {
echo "A {$n}ª coluna que mais tem '{$buscar}' é a coluna {$coluna}";
if ($n++ >= 10)
break;
}

Deve funcionar agora! ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

tu vai precisar fazer um store procedure,

primeiro tu faz um select para contar quantas letras F tem em cada campo

 

select
sum(case when campo1 like '%F%' then 1 else 0 end) c1,
sum(case when campo2 like '%F%' then 1 else 0 end) c2,
sum(case when campo3 like '%F%' then 1 else 0 end) c3,
....
from tabela

tu vai fazer o número de campos que você tem.

você pode gravar o resultado do select num vetor e verifica quais são os dez maiores valores

 

se o maior valor estiver na posição 77, você sabe que o campo é o campo77, tranquilo

 

aí você lista nome dos campos,

boa sorte

é trabalhoso mas não é difícil

Entendi sim amigo, mas o problema que tenho não só uma tabela assim, mas 10 tabelas com campos diferentes também.

Então desta forma, além de ser trabalhoso, o tempo para fazer seria muito.

 

Estou analizando todos os códigos aqui para ver se chego em uma solução.

 

Muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código correto:

$colunas = array();
$query = mysql_query("SELECT * FROM <tabela>");
while ($result = mysql_fetch_assoc($query)) {
foreach ($result as $coluna=>$valor) {
if (!isset($colunas[$coluna]))
$colunas[$coluna] = strtoupper($valor);
else
$colunas[$coluna] .= strtoupper($valor);
}
}
/*
echo "<pre>";
print_r($colunas);
echo "</pre>";
exit(0);
*/
unset($colunas['id']);
$totais = array();
$buscar = 'F';
foreach ($colunas as $col=>$valores) {
$totais[$col] = substr_count($valores, $buscar);
}
rsort($totais);
$n = 1;
foreach ($totais as $coluna=>$valores) {
echo "A {$n}ª coluna que mais tem '{$buscar}' é a coluna {$coluna}";
if ($n++ >= 10)
break;
}

Deve funcionar agora! ^^

O resultado foi o mesmo:

 

A 1ª coluna que mais tem 'F' é a coluna 0

A 2ª coluna que mais tem 'F' é a coluna 1

A 3ª coluna que mais tem 'F' é a coluna 2

A 4ª coluna que mais tem 'F' é a coluna 3

A 5ª coluna que mais tem 'F' é a coluna 4

A 6ª coluna que mais tem 'F' é a coluna 5

A 7ª coluna que mais tem 'F' é a coluna 6

A 8ª coluna que mais tem 'F' é a coluna 7

A 9ª coluna que mais tem 'F' é a coluna 8

A 10ª coluna que mais tem 'F' é a coluna 9

 

E você pode ver que a coluna 1 por exemplo não tem F.

 

Será que no lugar de "coluna 0, coluna 1" tem como me mostrar o nome dela?

 

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

(Acho que encontrei o erro)

 

Testa isso, onde tem:

foreach ($colunas as $col=>$valores) {
$totais[$col] = substr_count($valores, $buscar);
}

Coloca:

foreach ($colunas as $col=>$valores) {
$x = substr_count($valores, $buscar);
if ($x > 0) {
$totais[$col] = $x;
echo "Coluna '{$col}' tem {$x}x {$buscar}<BR>";
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

(Acho que encontrei o erro)

 

Testa isso, onde tem:

foreach ($colunas as $col=>$valores) {
$totais[$col] = substr_count($valores, $buscar);
}

Coloca:

foreach ($colunas as $col=>$valores) {
$x = substr_count($valores, $buscar);
if ($x > 0) {
$totais[$col] = $x;
echo "Coluna '{$col}' tem {$x}x {$buscar}<BR>";
}
}

É cara, agora não me deu resultado nenhum, página toda em branco.

 

Mas acho q o caminho é esse mesmo, você está perto.

Estou analizando aqui também para ver se encontro alguma coisa que possa nos ajudar.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom amigo, estou saindo pro trabalho agora... Quando voltar (01:00) caso não tenha resolvido seu problema, tentarei novamente...

 

De qualquer modo acompanharei seu progresso do trabalho... Mas não terei mto tempo pra responder.. ;)

 

Boa sorte http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom amigo, estou saindo pro trabalho agora... Quando voltar (01:00) caso não tenha resolvido seu problema, tentarei novamente...

 

De qualquer modo acompanharei seu progresso do trabalho... Mas não terei mto tempo pra responder.. ;)

 

Boa sorte http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Ok amigo, muito obrigado mais uma vez. Vou tentando aqui e qualquer progresso eu posto aqui para você ver também.

 

Bom trabalho, valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E se tentar alguma coisa do tipo:

 

$sql = "
CREATE TEMPORARY TABLE `contar` (
  `Id` int(10) unsigned NOT NULL auto_increment,
  `Campo_F` varchar(255) NOT NULL,
  PRIMARY KEY  (`Id`)
)
";

mysql_query($sql);

$rs = mysql_query("SELECT * FROM suatabela");

while ($L = mysql_fetch_assoc($rs)) {
	foreach($L as $nome => $valor) {
		if ($valor == "F" || $valor == "f") {

			mysql_query("INSERT INTO contar SET Campo_F = $nome");

		}
	}
};

$sql = "SELECT Campo_F,COUNT(Id) AS ct FROM contar GROUP BY Campo_F ORDER BY ct DESC LIMIT 0,10";
$rs = mysql_query($sql);

while ($L = mysql_fetch_assoc($rs)) {
	print("A coluna ".$L['Campo_F']." tem ".$L['ct']." \"F\" ");
}

Só uma sugestão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E se tentar alguma coisa do tipo:

 

$sql = "
CREATE TEMPORARY TABLE `contar` (
  `Id` int(10) unsigned NOT NULL auto_increment,
  `Campo_F` varchar(255) NOT NULL,
  PRIMARY KEY  (`Id`)
)
";

mysql_query($sql);

$rs = mysql_query("SELECT * FROM suatabela");

while ($L = mysql_fetch_assoc($rs)) {
	foreach($L as $nome => $valor) {
		if ($valor == "F" || $valor == "f") {

			mysql_query("INSERT INTO contar SET Campo_F = $nome");

		}
	}
};

$sql = "SELECT Campo_F,COUNT(Id) AS ct FROM contar GROUP BY Campo_F ORDER BY ct DESC LIMIT 0,10";
$rs = mysql_query($sql);

while ($L = mysql_fetch_assoc($rs)) {
	print("A coluna ".$L['Campo_F']." tem ".$L['ct']." \"F\" ");
}

Só uma sugestão.

Olá amigo, boa noite!

 

Testei sua sugestão, mas infelizmente não funcionou.

Deu este erro:

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/g34731/public_html/inspeserv/sistema/gerar_relatorioTESTE.php on line 28

 

Nesta linha:

while ($L = mysql_fetch_assoc($rs)) {

Verifiquei o seu código, e é isso mesmo que preciso, acho q é o caminho sim.

Caso tenha mais alguma sugestão ou alteração neste, estou aguardando.

 

muito obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não pegou e colou o código não né !!!!!!!!!!!!

 

Você acertou o nome da tabela na linha:

 

$rs = mysql_query("SELECT * FROM suatabela");

 

Muda também essa linha:

 

mysql_query("INSERT INTO contar SET Campo_F = $nome");

 

Troca para:

 

mysql_query("INSERT INTO contar (Campo_F) VALUE ('".$nome."')");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não pegou e colou o código não né !!!!!!!!!!!!

 

Você acertou o nome da tabela na linha:

 

$rs = mysql_query("SELECT * FROM suatabela");

 

Muda também essa linha:

 

mysql_query("INSERT INTO contar SET Campo_F = $nome");

 

Troca para:

 

mysql_query("INSERT INTO contar (Campo_F) VALUE ('".$nome."')");

 

Olá amigo, agora sim está tudo certo, funcionou perfeitamente!

 

vou fazer mais alguns testes, mas pelo resultado está correto:

 

O código ficou assim:

<? include("conexao.php"); 

$sql = "
 CREATE TEMPORARY TABLE `g34731_inspeserv`.`contar` (
`Id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`Campo_F` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `Id` )
) ENGINE = MYISAM 
";

mysql_query($sql) or die (mysql_error());

$rs = mysql_query("SELECT * FROM laudos_caminhao") or die (mysql_error());

while ($L = mysql_fetch_assoc($rs)) {
	foreach($L as $nome => $valor) {
		if ($valor == "F" || $valor == "f") {

			mysql_query("INSERT INTO contar (Campo_F) VALUE ('".$nome."')") or die (mysql_error());

		}
	}
};

$sql = "SELECT Campo_F,COUNT(Id) AS ct FROM contar GROUP BY Campo_F ORDER BY ct DESC LIMIT 0,10";
$rs = mysql_query($sql) or die (mysql_error());

while ($L = mysql_fetch_assoc($rs)) {
	print("A coluna ".$L['Campo_F']." tem ".$L['ct']." \"F\"<br> ");
}
?>

 

O resultado foi este:

A coluna estabilizador_dianteiro tem 6 "F"
A coluna feixe_molas_dianteiro tem 5 "F"
A coluna freios_dianteiros tem 4 "F"
A coluna freios_traseiros tem 4 "F"
A coluna comotador tem 4 "F"
A coluna motor tem 4 "F"
A coluna parachoque_traseiro tem 3 "F"
A coluna estabilizador_traseiro tem 3 "F"
A coluna estepe tem 3 "F"
A coluna setor_direcao tem 3 "F"

Muito Obrigado JCMPJ, muito obrigado mesmo, ajudou muito mesmo!

 

Obrigado a todos também.

 

Abraços!

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.