Jump to content


Photo

Como Contar E Mostrar 10 Campos Com Mais Valores Iguais


  • Faça o login para participar
6 replies to this topic

#1 Fabio Penna

Fabio Penna

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 11/07/2008, 15:02

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.

Preciso com urgência de uma ajuda.

Qualquer dúvida, me perguntem.

Obrigado,
Fábio Penna

Edição feita por: Fabio Penna, 11/07/2008, 16:12.


#2 .:: Julio´Psy ::.

.:: Julio´Psy ::.

    Turista

  • Usuários
  • 48 posts
  • Sexo:Masculino

Posted 11/07/2008, 15:22

Pesquisa por SELECT DISTINCT COUNT

;)

#3 Fabio Penna

Fabio Penna

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 11/07/2008, 15:34

Pesquisa por SELECT DISTINCT COUNT

;)


Ok, vou pesquisar sobre isso sim, obrigado.

#4 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 11/07/2008, 15:43

Não quero ser do contra, mas acho que você tem um problema de modelagem.
Se fossem registros ao invés de colunas, seria muito simples!
Com a sua estrutura dá pra fazer, mas vai "pennar" (desculpe :D ) muito mais.

#5 Fabio Penna

Fabio Penna

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 11/07/2008, 16:04

Não quero ser do contra, mas acho que você tem um problema de modelagem.
Se fossem registros ao invés de colunas, seria muito simples!
Com a sua estrutura dá pra fazer, mas vai "pennar" (desculpe :D ) muito mais.


O problema que minha estrutura não tem como fazer por registros, pois são laudos cadastrados constantemente, e todos utilizam os mesmos campos, por isso perciso de todas estas colunas distintas.

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?

Obrigado boirock.

#6 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 11/07/2008, 16:14

O problema que minha estrutura não tem como fazer por registros, pois são laudos cadastrados constantemente, e todos utilizam os mesmos campos, por isso perciso de todas estas colunas distintas.

Tem sim... é só criar uma tabela auxiliar com id_pai, valor e identificador. Pronto.... daí COUNT resolveria!

Estou tentando alguma coisa tipo:
select count(distinct *) from laudos_caminhao where * = 'F'

Bem... isso não dá. E é disso que eu estou falando! Você quer fazer um SELECT "invertido". Se tem como, eu não sei :P
A minha sugestão é levar tudo isso aí para o PHP, colocar em uma array e fazer os cálculos no braço, invertendo a array...
Dava pra fazer isso com STORED PROCEDURE em BD, mas acho que não é a melhor saída, pois o processo seria o mesmo que levar para o PHP.

#7 Fabio Penna

Fabio Penna

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 12/07/2008, 11:41

O problema que minha estrutura não tem como fazer por registros, pois são laudos cadastrados constantemente, e todos utilizam os mesmos campos, por isso perciso de todas estas colunas distintas.

Tem sim... é só criar uma tabela auxiliar com id_pai, valor e identificador. Pronto.... daí COUNT resolveria!

Estou tentando alguma coisa tipo:
select count(distinct *) from laudos_caminhao where * = 'F'

Bem... isso não dá. E é disso que eu estou falando! Você quer fazer um SELECT "invertido". Se tem como, eu não sei :P
A minha sugestão é levar tudo isso aí para o PHP, colocar em uma array e fazer os cálculos no braço, invertendo a array...
Dava pra fazer isso com STORED PROCEDURE em BD, mas acho que não é a melhor saída, pois o processo seria o mesmo que levar para o PHP.


Entendi!

Um amigo desenvolveu o seguinte código:

$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;
}

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

Não está correto o resultado, mas acho q é o caminho.

Outro detalhe que eu precisava é saber o nome da coluna, e não qual o número dela, se for possível.

Se alguém puder analizar este código e saber o que pode está de errado?

Olá Pessoal, estou utilizando o forum abaixo com este mesmo assunto.

http://forum.imaster...p...=295598&hl=

Obrigado.

______________________________________________________________________________________________________________________

RESOLVIDO

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

Um amigo em outro forum me ajudou e chegamos na seguinte conclusão:

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 amigos.
Abraços!

Edição feita por: Fabio Penna, 12/07/2008, 11:42.





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq