Ir para conteúdo

Arquivado

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

jcsalim

Classificação de candidatos e desempate

Recommended Posts

Pessoal boa noite, sou novo no fórum e estou precisando da ajuda de vocês no mysql.

 

Seguinte: Tenho uma tabela com o nome de tbl_candidados essa tabela guarda a inscrição, nome_cand, idade, nota_total, tempo_serv, form_profissional, data_nasc.

Veja o que preciso, para exibir em uma mesma grid.

1 - Selecionar na tabela os candidatos que tiveram a maior nota em ordem decrescente,

Se houver empate:

2 - se o candidato ao cargo tiver idade  >= 60 anos, está classificado,

3  - caso não tenha candidatos ao cargo que possua 60 anos ou mais, terei que classificar conforme a maior nota de tempo_serv,

e se tiver notas com valores iguais,

4 - classifico pela formação profissional de acordo com a maior nota, agora se houver empate classifico pela data de nascimento, observando dia/mes/ano de nascimento.

 

TRADUZINDO

 Exibo a nota total de todos os candidatos,

 

Caso houver empate:

Verifico se tem algum candidato com idade igual  o ou maior que 60 anos, se sim está classificado e se der empate verifico a maior nota de tempo de serviço e se tiver empate na nota de tempo de serviço verifico a nota de formação profissional e se houver empate, classifico pela data de nascimento dia/mes/ano.

 

Caso não tenha candidatos com 60 anos ou mais, faço a classificação pelo tempo de serviço (maiores notas) se tiver notas iguais, classifico pela nota de formação profissional e se mesmo assim houver empate classifico pela data de nascimento dia/mes/ano.

 

Caso ainda haja empate será no par ou impar.

 

 

Agora como posso montar isso no mysql estou utilizando php e mysql, peço ajuda dos colegas, pois meio leigo no mysql, conheço pouco.

 

Me ajudem aí, como fazer o que fazer.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

deve funcionar , não entendi  o critério da data de nascimento todavia

 

ORDER BY nota_total  DESC,
         (CASE WHEN IDADE >= 60 THEN 0 ELSE 1 END),
         tempo_serv DESC,
         form_profissional,
         data_nasc desc ,
         RAND() ALEATORIO

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Motta disse:

deve funcionar , não entendi  o critério da data de nascimento todavia

 


ORDER BY nota_total  DESC,
         (CASE WHEN IDADE >= 60 THEN 0 ELSE 1 END),
         tempo_serv DESC,
         form_profissional,
         data_nasc desc ,
         RAND() ALEATORIO

 

Motta valeu pela dica a questão da data de nascimento seria se a nota de tempo de serviço e a nota de formação profissional forem iguais (Empate), deve-se analisar pela data de nascimento dia/mes/ano, vamos supor eu nasci em 10/05/1980 e estou empatado com um candidato que nasceu em 05/01/1980, ele será classificado porque é mais velho que eu. O código precisa ser analisado linha a linha e ficar sempre na posição acima de quem tem as notas menores do que ele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

então (supondo que o campo "data_nasc" seja do tipo DATE)

 

ORDER BY nota_total  DESC,
         (CASE WHEN IDADE >= 60 THEN 0 ELSE 1 END),
         tempo_serv DESC,
         form_profissional,
         data_nasc asc ,
         RAND() ALEATORIO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo só mais uma dúvida como coloco o resultado da classificação automático no mysql, tipo assim:

 

ORDER BY nota_total  DESC,
         (CASE WHEN IDADE >= 60 THEN 0 ELSE 1 END), = SE CLASSIFICADO TENDO 60 OU MAIS -> CLASS 60 ANOS
         tempo_serv DESC, = SE CLASSIFICADO POR TEMPO_SERV -> CLASS TEMPO SERVIÇO
         form_profissional, = SE CLASSIFICADO POR FORMAÇÃO -> CLASS POR FORMAÇÃO PROFISSIONAL
         data_nasc asc , = SE CLASSIFICADO POR IDADE -> CLASS POR IDADE
         RAND() ALEATORIO , TEM COMO.

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que não (de forma simples) pois seria precisa ler os registros posteriores para saber esta ordem , no Oracle existe uma facilidade chamada "analytic functions" que em tese permitiria isto , mas no MySQl não me ocorre como fazer.

 

A simples ordem não basta ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
13 minutos atrás, Motta disse:

Acho que não (de forma simples) pois seria precisa ler os registros posteriores para saber esta ordem , no Oracle existe uma facilidade chamada "analytic functions" que em tese permitiria isto , mas no MySQl não me ocorre como fazer.

 

A simples ordem não basta ?

A ordenação ta beleza mas preciso exibir os resultado da classificação, em cada linha. eu achei um código que gera a coluna mas não sei como exibir os resultados dentro dela, para cada situação diferente. Veja abaixo.

 

SET @posicao:=0;
SET @total_pontos:='';
SELECT
@posicao:=
    CASE
        WHEN @total_pontos=total_pontos THEN @posicao
        ELSE @posicao + 1
    END
AS posicao,
inscricao,
@total_pontos:= total_pontos as nota_total
FROM
(
    SELECT inscricao, SUM(nota_total) AS total_pontos FROM
    tbl_candidatos GROUP BY inscricao
) total
ORDER BY total_pontos DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente :

 

Com base no sql da ordenação gerar outra tabela do tipo

sequencial , inscrição, nome_cand, idade, nota_total, tempo_serv, form_profissional, data_nasc

 

fazer um sql do tipo


 

select *
from tabela_ordenada t1 , tabela_ordenada t2
where t1.sequencial = (t2.sequencial -1)

 

Assim se tem o registro imediatamente anterior e usando CASEs , IIFs montar uma coluna do "motivo de ordenação"

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Motta disse:

Tente :

 

Com base no sql da ordenação gerar outra tabela do tipo

sequencial , inscrição, nome_cand, idade, nota_total, tempo_serv, form_profissional, data_nasc

 

fazer um sql do tipo


 


select *
from tabela_ordenada t1 , tabela_ordenada t2
where t1.sequencial = (t2.sequencial -1)

 

Assim se tem o registro imediatamente anterior e usando CASEs , IIFs montar uma coluna do "motivo de ordenação"

 

Não entendi, tenho que criar outra tabela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi Motta, podia ser mais específico, terei que criar uma nova tabela no banco de dados, com outro nome e associar a minha outra tabela, ou insiro essa select na ordenação da minha tabela atual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sugestão de outra tabela é porque não conheço MySql o suficiente para pensar outra solução , criar outra tabela para ter um número sequencial com a ordem de classificação, assim seria possível ler o  registro imediatamente anterior para se "calcular" o motivo.

 

Pode ter outra solução mas confesso não me ocorrer.

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta descobri um erro aqui na exibição das tabelas

 

ORDER BY nota_total  DESC,
         (CASE WHEN IDADE >= 60 THEN 0 ELSE 1 END),
         tempo_serv DESC,
         form_profissional,
         data_nasc asc ,
         RAND() ALEATORIO 

 

os valores da tabela form_profissional quando só tem um valor como o 3 ele esta ficando na frente dos valores que possuem o valor tipo 10 E ele deveria ficar abaixo, sendo último valor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo assim: nota_total = 28   tempo_serv = 3   form_profissional = 25

                      nota_total = 28   tempo_serv = 24 form_profissional = 4

                      nota_total = 28   tempo_serv = 16 form_profissional = 12

 

O resultado que deveria estar na frente seria o com a maior nota 28 -> 24 ->4

Esta ao contrario somente quando o numero vai de 1 a 9, que o zero  está normal e os numeros acima de 10 estão seguindo o padrão do código. 
 



Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o "type" do coluna tempo_serv ? Se for CHAR ou VARCHAR será preciso converter para numérico.

Compartilhar este post


Link para o post
Compartilhar em outros sites
32 minutos atrás, Motta disse:

Qual o "type" do coluna tempo_serv ? Se for CHAR ou VARCHAR será preciso converter para numérico.

CHAR

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente

 

ORDER BY nota_total  DESC,
         (CASE WHEN IDADE >= 60 THEN 0 ELSE 1 END),
         CONVERT(tempo_serv, UNSIGNED) DESC,
         form_profissional,
         data_nasc asc ,
         RAND() ALEATORIO 

 


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Renato Harly
      Estou criando um sistema onde 4 candidatos são eleitos por maioria de votos. Sendo que o mais votado recebe a classificação de Presidente, o 2º mais votado recebe a classificação de Vice-Presidente, o 3º mais votado recebe Secretário e o 4º mais votado fica como Suplente. Mas se existir empate entre eles o critério de desempate  seria por mais tempo de serviço em uma instituição. Não estou sabendo fazer o critério de desempate. Alguém tem alguma ideia? Esse é o código pra atribuir a classificação de acordo com o número de votos
       
      <?php
      $sql = "SELECT `qnt_voto` FROM `votos` WHERE `qnt_voto` = (SELECT MAX(`qnt_voto`) FROM `votos`)";
      $sql = $conexao->query($sql);
      $row = $sql->fetch_assoc();
      $row5 = $row['qnt_voto'];
      $_SESSION['num'] = $row5;
      if($sql == true){
              
              $colocacao = "UPDATE votos SET status_voto = 'Presidente'
              WHERE qnt_voto = '".$_SESSION['num']."'";
              $colocacao_resultado = mysqli_query($conexao, $colocacao);
      }
      $sql = "SELECT MAX(`qnt_voto`) FROM `votos` WHERE `qnt_voto` < (SELECT MAX(`qnt_voto`) FROM `votos`)";
      $sql = $conexao->query($sql);
      $row = $sql->fetch_assoc();
      $row5 = $row['MAX(`qnt_voto`)'];
      $_SESSION['num2'] = $row5;
      if($sql == true){
              
              $colocacao = "UPDATE votos SET status_voto = 'Vice-Presidente'
              WHERE qnt_voto = '".$_SESSION['num2']."'";
              $colocacao_resultado = mysqli_query($conexao, $colocacao);
          
          
      }

      $sql = "SELECT MIN(`qnt_voto`) FROM `votos` WHERE `qnt_voto` > (SELECT MIN(`qnt_voto`) FROM `votos`)";
      $sql = $conexao->query($sql);
      $row = $sql->fetch_assoc();
      $row5 = $row['MIN(`qnt_voto`)'];
      $_SESSION['num3'] = $row5;
      if($sql == true){
              
              $colocacao = "UPDATE votos SET status_voto = 'Secretário'
              WHERE qnt_voto = '".$_SESSION['num3']."'";
              $colocacao_resultado = mysqli_query($conexao, $colocacao);
        
      }   

      $sql = "SELECT `qnt_voto` FROM `votos` WHERE `qnt_voto` = (SELECT MIN(`qnt_voto`) FROM `votos`)";
      $sql = $conexao->query($sql);
      $row = $sql->fetch_assoc();
      $row5 = $row['qnt_voto'];
      $_SESSION['num4'] = $row5;
      if($sql == true){
              
              $colocacao = "UPDATE votos SET status_voto = 'Suplente'
              WHERE qnt_voto = '".$_SESSION['num4']."'";
              $colocacao_resultado = mysqli_query($conexao, $colocacao);
      }
    • Por r257solutions
      Galera sou leigo em php, porêm preciso colocar uma tabela de campeonato pra rodar!
      o campeonato tem 13 etapas e os pontos são acumulados e eu preciso estar alimentando a cada etapa e assim o "sistema" faz o calculo em ordem decrescente!
      Atualmente tenho feito em Excel e depois exporto para pdf para publicar no site, mais gostariamos de fazer isso online... conforme o piloto corre já digitamos a pontuação dele e a tabela já se atualiza automaticamente!

    • Por KeyApp.Top
      Promova a classificação do seu aplicativo com Keyword Installs (Instalações de Palavras-chave)
       
      Olá a todos! Nós apresentamos a vocês uma nova ferramenta revolucionária para promover seu aplicativo na Play store.
       

      Essa não é mais uma daquelas ferramentas pouco efetivas de incentivo ao tráfico, isso é um método para colocar seu aplicativo bem por cima dos outros. Isso é Keyword Installs (Instalações de palavras-chave).
       
      Eis como funciona:
      Escolha uma palavra-chave para qual você quer aumentar seus rankings nas pesquisas
          2. Compre Keyword Installs de nós.
          3. Aproveite ver o seu aplicativo em 1º lugar nas pesquisas
             orgânicas pela sua palavra-chave.
      Mas isso ainda não é tudo!! Receba US$ 20 (R$ 65) para usar com os nossos serviços só por criar uma conta!!  
       
      Os nossos preços são os seguintes:
       
      1 instalação de palavra-chave —  R$ 0,52 (US$ 0,16)
      1 instalação de palavra-chave + classificação — R$ 0,72 (US$ 0,22)
      1 instalação de palavra-chave +classificação + avaliação — R$ 0,88 (US$ 0,27)
       
      1 instalação de pacote — R$ 0,29 (US$ 0,09)
      1 instalação de pacote  + classificação — R$ 0,49 (US$ 0,15)
      1 instalação de pacote  + classificação + avaliação — R$ 0,65 (US$ 0,20)


       
      Para saber mais, visite o nosso website: KeyApp.top - Android keywords promotion
      Caso estiver interessado, ou se tiver dúvidas, por favor, entre em contato conosco por e-mail: sales@keyapp.top ou skype: karen.rendall_1
       
       
    • Por John Lopes
      Olá. Sou novo em programação, tenho uma liga de um FPS online, estou criando um site pois pretendo fazer um campeonato. Consegui criar todo o site, porém estou tendo um problema que não sei como criar uma tabela de classificação e também uma tabela de jogos na qual eu possa definir os confrontos. Gostaria de saber se alguém pode me ajudar com essa questão. Desde já agradeço!
    • Por Luciano Gregorio
      Turminha tenho em um banco de dados isso aqui!
       
      id_tabela, nome, paróquia
       
      quero fazer um jeito de efetuar um Rank por paróquia!
       
      cada sócio é cadastrado por paróquia, o que ocorre agora é que eu preciso contar quantos sócios já foram cadastrado por paróquia e colocar as paróquias em ordem como se fosse um Rank de maior sócios cadastrados!
       
       
      como é que eu faço uma consulta ou contagem de quantas vezes o nome da paroquia se repete dentro do banco de dados!? e ainda possa colocar o resultado disso em ordem decrescente.
       
      um exemplo do que eu quero que apareça:
       
      paroquia | sócios cadastrados
       
      paróquia 1 | 50
       
      paróquia 2 | 49
       
      paróquia 3 | 30
       
      paróquia 4 | 25
       
      paróquia 5 | 6
       
       
      fico muito agradecido se alguém puder me ajudar nesta empreita!!!!
       
×

Informação importante

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