Ir ao conteúdo

Posts recomendados

Postado

Boa noite amigos!

tenho este código em uma pagina e esta funcionando, só que estou tentando acrescentar alguns parâmetros nele, e não estou conseguindo.

require("../conectar.php");//chama o arquivo de conexão com o BD

$consultarwcp = mysqli_query($conn, "SELECT *  FROM apurar WHERE secao ");
 if(mysqli_num_rows($consultarwcp) > 0){
		
	$validos = mysqli_query($conn, "SELECT sum(votos) FROM apurar");
	while($sum = mysqli_fetch_array($validos)){
	$somaV = $sum['sum(votos)'];
	}

	$sql = "SELECT SUM(votos) as SOMA, candidatos FROM apurar GROUP BY candidatos ORDER BY SOMA DESC";
	$exec = mysqli_query($conn, $sql);

	while ($rows = mysqli_fetch_assoc($exec)) {
		echo "<table><tr> <td>".$rows["candidatos"]."</td> 
				   <td>".$rows["candidatos"]."</td> 
				   <td>".$rows["SOMA"]."</td><td>".number_format(($rows["SOMA"] * 100)/$somaV, 2, '.', ',')." %</td>
		</tr></table>";
	}
 }

basicamente ele vai ate a tabela apurar, lista todos nos nomes na coluna candidato, faz um somasse na coluna votos, unindo os valores q tenha nomes iguais, e me retorna os dados em ordem decrescente.

segue imagem com o meu novo BD

221402958_NovaImagem(2).thumb.png.9767f520d70bb50fdf079bd1a13995cd.png

 

estou tentando alterar aquele código para fazer o seguinte:

ele vá a tabela PS, liste os números que estão em num_ps, depois

vá em qrcode, busque os mesmos valores na coluna numero, faça o somasse em votos, e me retorne em ordem decrescente...

 

numero listado, nome q esta em cand_ps, e os votos, e % dos valores....

 

 

outro ex:

os dados em PS vão estar assim:

id                num_ps               cand_ps

1                   47                       maria

2                   84                       joyce

3                   33                       julia

os dados em Qrcode:

id            secao             numero           votos

1               70                 47                    200

2               70                 84                    150

3               70                 33                     300

4               70                 66                    180

5               70                 71                    410

6               85                 47                    100

7               85                 84                    200

8               85                  33                   400

9               85                 66                    280

10              85                 71                    510

11              123                47                    50

12              123                84                     70

13              123                33                     20

14              123                66                    99

15              123                71                    550

 

e preciso que me retorne

33     julia       720      48,32%

84     joyce     420      28,19%

47     maria     350      23,49%

 

 

já olhei em vários tópicos, e em vários outros fóruns, mas não achei como alterar, e as que faço retorna erro, aguem pode alterar pra mim por favor?

  • Moderador
Postado

@deejaywesley Não seria mais fácil  definir o campo de votos como INT?  você usou como texto....

 

Partindo de uma tabela simples onde só contém a seção, o número do candidato e os votos deles... exemplo:

CREATE TABLE urna
(id int(11) NOT NULL AUTO_INCREMENT,
 secao varchar(3),
 numero varchar(2),
votos int(11), PRIMARY KEY(id));

INSERT INTO urna (secao, numero, votos) VALUES ('70','47',200), 
                                               ('70','84',150),
                                               ('70','33',300),
                                               ('70','66',180),
                                               ('70','71',410),
                                               ('85','47',100),
                                               ('85','84',200),
                                               ('85','33',400),
                                               ('85','66',280),
                                               ('85','71',510),
                                               ('123','47',50),
                                               ('123','84',70),
                                               ('123','33',20),
                                               ('123','66',99),
                                               ('123','71',550);

 

Você pode calcular a porcentagem direto no SQL desta forma:

Select secao, 
       numero, 
       sum(votos) as 'soma total dos votos', 
       sum(votos) * 100.0 / (SELECT sum(votos) from urna) as 'percentual de votos'
       FROM urna GROUP BY numero

 

Vai retornar:

spacer.png 

 

Claro que esse é só um exemplo simples...  No caso, você quer trazer os nomes dos candidatos, mas para isso, você deve fazer os relacionamentos 1:N  nas tabelas..

Onde as tabelas seriam do tipo:

Candidatos,

e urna

 

Urna, seria a tabela mandante, e candidatos fariam um relacionamento...  de 1:N  onde nele recebe os dados das outras tabelas..

 

Se bem feito a consulta poderia ser feita dessa maneira:

Select candidato.numero, 
       candidato.nome, 
       sum(urna.votos) as 'soma total dos votos', 
       sum(urna.votos) * 100.0 / (SELECT sum(urna.votos) from urna) as 'percentual de votos'
       FROM urna 
       INNER JOIN candidato ON candidato.ID = urna.candidato_ID
       GROUP BY candidato.numero ORDER BY candidato.numero DESC

 

Nesse caso, a instrução SQL buscaria o número e o nome na tabela de candidatos e compararia com o valor que terá na tabela da urna...

ONde  na tabela de urna teria os seguintes registros:

 

ID  candidato_ID votos
1      1          200
2      2          150  
3      3          300
4      4          180 

 

Veja, que nessa tabela os candidatos estão com números ID, que seriam chaves estrangeiras relacionada a chave primária na tabela de candidatos:

 

ID  nome   numero
1   julia    33
2   joyce    84
3   maria    47 
4   birubiru 66

 

Ainda, você poderia até aplicar as regras de Normas Formais...  distrinchando a tabela de candidato,  em   partidos,  legenda....  e etc...  Isso porque, os partidos tem diversos candidatos...  e dados podem ficar incosistentes... então quanto mais detrinchado, melhor...   E claro, se destrinchar mais,  mais "INNER JOIN"  você teria que colocar na instrução SQL da tabela urna... para ter um retorno do tipo:

 

Secao  partidoLegenda numeroCandidato nomeCandidato total de votos  percentual de votos
 70      NN                23            fulano        500                30.3834
 70      AA                43            beltrano      1000               70.3493

O exemplo da tabela acima é bem simbólico, não tem calculo  nenhum, só coloquei numeros para preencher.

 

Uma dica, sempre que puder calcular direto no sql, faça. 

  • Curtir 1
Postado

Boa Noite @DiF , muito obrigado pelo retorno.

16 horas atrás, DiF disse:

Não seria mais fácil  definir o campo de votos como INT?  você usou como texto....

coloquei como texto, porque os dados que vão estar na tabela qrcode, vai ter texto, aqui esta um...

Citação

QRBU:1:2 VRQR:1.5 VRCH:20201013 ORIG:VOTA ORLC:LEG PROC:297 DTPL:20201115 PLEI:304 TURN:1 FASE:O UNFE:MG MUNI:49611 ZONA:211 SECA:197 AGRE:256 IDUE:1266929 IDCA:342170834320399162250941 VERS:7.34.1.0 LOCA:1228 APTO:546 COMP:392 FALT:154 DTAB:20201115 HRAB:070000 DTFC:20201115 HRFC:170249 IDEL:426 CARG:13 TIPO:1 VERC:202011011750 PART:13 13013:9 13100:1 LEGP:0 TOTP:10 PART:14 14000:3 14014:2 14110:5 14123:6 14193:1 14333:2 14365:2 14733:1 14777:9 14789:12 14999:2 LEGP:0 TOTP:45 PART:19 19000:20 19019:10 19100:1 19111:2 19123:4 19333:3 19777:1 19789:7 19800:1 19999:9 LEGP:1 TOTP:59 PART:22 22000:2 22022:4 22100:12 22111:1 22123:40 22210:1 22212:2 22222:8 22345:1 22456:3 22777:4 22789:1 22999:1 LEGP:4 TOTP:84 PART:23 23000:6 23100:3 23200:1 23456:1 23999:3 LEGP:0 TOTP:14 PART:25 25000:1 25025:3 25050:2 25100:5 25111:4 25113:1 25123:2 25199:3 HASH:F40CE3537D03DD346CEA55BC6A7130E521646EBF0603FECEB5D99BF1ECC1F1CD8DB5FC0676C604F0BBD65946B3D669AA876C290A3DDDD352AE5E7797FAE6974B

serão vários qrcode escaneados e enviados, sendo, o que esta antes dos dois pontos, na coluna numero e o que esta depois na coluna votos.

por isso pensei em ter uma outra tabela com o numero e nomes dos candidatos, porque esta seria digitada manualmente, ai por ex, o candidato fulano de numero 25199, neste qrcode retornaria 3 votos, e conforme forem escaneado novos qr, iria somando, pegando o 25199, na coluna num_ps como referencia e buscando ele na coluna numero em qr, como um somases de excel, porque ai ignoraria todo o resto do qrcode.

 

quanto a sugestão de somar direto no sql, gostei muito, mas não sei se vou conseguir funcionar, porque como no modelo acima vai ter letras no mesma coluna números.

 

Me desculpe se eu demorar a entender seu raciocínio, porque ainda sou muito iniciante em php e sql, eu cheguei a ler um pouco sobre "INNER JOIN" que você mencionou, mas não consegui fazer funcionar no meu projeto, mas todas ideias e sugestões são bem vindas☺️, e desde já muito obrigado pela atenção!😎

  • Curtir 1
  • Moderador
Postado

@deejaywesley  O jeito que você está fazendo, está fora das normas formais, que são regras de normalização de banco de dados.  Pois do jeito que está, pode haver inconsistências  com dados repetidos que podem comprometer o resultado.

O ideal, seria se quando escaneasse o qrcode, destrinchar os dados para poder inserir na tabelas destinadas.  Não necessariamente você precisa ter uma tabela contendo dados iguais porque gera incosistência.

 

Você pode usar uma biblioteca para dar um decoder no qrcode,  pegar os dados e dividir a string do qrcode com explode().   Assim você pode armazenar esses dados em um array ou até mesmo colocar em variáveis.  dessa forma, você tem o controle total dos dados armazenados no qrcode.   Pelo que eu vejo no seu exemplo de  qrcode possui pelo menos 2 delimitadores.. que é o "espaço em branco" e o "dois pontos"..  No caso, você poderia substituir o espaço em branco por um "ponto e virgula" só para ficar mais fácil de ter um delimitador separando cada tipo de dado. 

Não sei bem o que são cada uma daquela siglas, mas entendi que por exemplo 19000:20   seria  "candidato:voto"

Exemplo simples do explode...  considerando APENAS o candidato:voto. 

 

$votacao  = "19000:20";
$registroVotos = explode(":", $votacao);

$candidato = $registroVotos[0]; // candidato
$voto = $registroVotos[1]; // voto

No exemplo,  a string contendo os dados do qrcode, foi destrinchada em duas e armazenada na variável.  Dessa forma, você poderia fazer um insert into, na tabela de votos. Claro, isso é só um exemplo não funcional porque é muito mais do que apenas isso.

 

Como eu disse antes, você teria que modelar as tabelas e normalizar elas... criando relacionamentos de forma que você possa usar uma tabela com relacionamento N:N  que vai conter todos os dados necessários para você construir o relatório. 

 

3 horas atrás, deejaywesley disse:

eu cheguei a ler um pouco sobre "INNER JOIN" que você mencionou, mas não consegui fazer funcionar no meu projeto

O INNER JOIN, só funciona QUANDO existe um relacionamento.  No seu caso, você não tinha feito nenhum.  Um relacionando consiste em chave estrangeira, relacionada a chave primária entre duas tabelas.

 

Vamos a um exemplo simples:

vamos supor que  temos duas tabelas chamada cliente,  e uma tabela chamada contato.   Visto que um cliente pode ter mais de um contato, é preciso normalizar a tabela aplicando a 1NF e 2NF

 

Cliente:

ID  nome     endereco
1   fulano   rua primeiro 
2   beltrano rua segundo
3   ciclano  rua terceiro 

 

contato:

ID  ID_cliente  numeroContato
1      1        (021)xxxxxxxxx 
2      1        (021)xxxxxxxxx 
3      2        (051)xxxxxxxxx
4      3        (011)xxxxxxxxx

 

Repare que na tabela de contatos, possui um campo chamado ID_cliente.   Este campo é uma chave estrangeira, relaciona a chave primária da tabela cliente. 

Na tabela de contatos, você vai inserir um índice onde vai informar que o campo cliente vai ser um campo será do tipo INDEX...  

Daí então para pegar  os dados das duas tabelas que são relacionadas, é usado o INNER JOIN.

 

exemplo:

SELECT cliente.nome,
       cliente.endereco,
       contato.numeroContato
FROM cliente 
INNER JOIN contato ON contato.ID = cliente.ID

Mas como eu disse, para funcionar, é preciso fazer corretamente os relacionamentos nas tabelas.. e mais importante, estas tabelas devem ser do tipo InnoDB.   Por padrão, o phpmyadmin, deixa como MyISAM.

 

A importância de usar campos com tipo certos de dados, é necessária... no caso do seu ali em cima, tudo está como text... então todos os número estão sendo tratados como "texto" e não como "números"..  aí a função de SUM, não funciona, ou seria necessário  separar o que for texto e o que for numero e fazer um CAST. 

Então para evitar todos esses pepinos,  eu recomendo, você  buscar uma biblioteca para php que faça decode do qrcode,   pegue os dados,  separe eles em variáveis,  e então fazer insert nas tabelas destinas.....

 

daí você cria uma tabela para partidos, uma tabela para candidatos, uma tabela para votos( esta tabela de votos, iria conter campos de chave estrangeira para tabela de para partidos, candidatos, seções eleitorais..e etc)

 

E aí você deixaria os campos de votos como INT,  tornando sua vida mais fácil para cálculos!

  • Curtir 1
Postado

Boa noite @DiF

Muito obrigado pelo retorno meu amigo, vou fazer as alterações que você sugeriu, e vou pesquisar e estudar mais um pouco sobre suas dicas, porque php e sql estou aprendendo na cara e coragem mesmo, conforme forem surgindo as duvidas vou postando aqui kkkkkkkkk.

Mais uma vez obrigado pelas orientações e pela atenção!

forte abraço!

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!