Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Meu problema é o Seguinte:
Num sistema de RH, é inserido os dados de candidatos as vagas da organização, e tenho que montar um script para retornar a relação de candidatos que atende a uma serie de requisitos que seram passados no momento da consulta.
A estrutura da tabela é a seguinte:
+----------------------------+
| intCandidatoId (chave) |
| intCargoPretendido |
| blnSexo |
| strEstadoCivil |
| intFilhos |
+----------------------------+
A consulta deve retornar os canditados que atendem a um ou mais dos criterios passados (até ai é tranquilo) e exibir eles na ordem dos que melhor atendem (ai ta o problema).
Ou seja, os candidatos deveram estar classificados de acordo com a "melhor pontuação", ou seja os que atendem mais requisitos.
Minha duvida é se só com SQL consigo resolver este problema, ou vou presisar usar algumas funções em PHP, e como fazer isto......
>
pelo sql mesmo você consegue...
a unica coisa é você definir o que vai ser o criterio acho que você pode fazer isso sem usar nenhuma função ... basta usar o order by...
por exemplo...
estou procurando candidatos do sexo feminino, viuvas, sem filhos...
faz assim:
select * from tabela WHERE intCargoPretendido = 5 ORDER BY blnSexo ASC, srtEstadoCivil DESC, intFilhos ASCisso deverá retornar o que procurei... =]
Ola guezth, mas acho que é um pouco mais complicado que isto, vou tentar explicar um pouco melhor, o meu SQL seria mais ou menos assim:
select * from tabela WHERE intCargoPretendido = 5 OR blnSexo=0 OR srtEstadoCivil='solteiro OR intFilhos=0
Ele me retornaria TODOS da tabela que atendem a PELO MENOS 1 dos critérios, e a partir dai eu preciso "contar" quantos criterios cada candidato atende e classificar a partir desta contagem.
Rafael, sim, mais facil ainda, você vai fazer do mesmo jeito, a unica coisa é que você vai definir os criterios de pontuação, e definir isso pela posição do order...
Rafael, sim, mais facil ainda, você vai fazer do mesmo jeito, a unica coisa é que você vai definir os criterios de pontuação, e definir isso pela posição do order...
guezth, não entendi, como ficaria o SQL?
select * from tabela WHERE intCargoPretendido = 5 OR blnSexo=0 OR srtEstadoCivil='solteiro OR intFilhos=0 ORDER BY ?????????
Se eu deixar o ORDER BY para blnSexo,strEstadoCivil ele vai classificar (penso eu) inicialmente todas as mulheres (strSexo = 0) casadas (strEstadoCivil='Casadas'), e não é isto que eu quero.......
Ele vai classificar em ordem "alfabetica" nestes campos, correto???? Mas o que eu quero é que ele CONTE quantos destes criterios o candidato atendeu e classifique por este novo campo.... eu acho que se isto for possivel fazer direto no SQL deve ser alguma coisa assim..... (só pensando):
select campos,CONT(sei la) AS "Avaliacao" from tabela WHERE intCargoPretendido = 5 OR blnSexo=0 OR srtEstadoCivil='solteiro OR intFilhos=0 ORDER BY Avaliacao DESC
Mas as minhas tentativas neste sentido não foram muito felizes....
to fazendo um exemplo aqui, pra você dar uma olhada...
fiz aqui de uma forma beeeeeeeeeeeeem gambiarrada:
veja
<?
$conecta = mysql_connect("localhost", "root", "") or die(mysql_error());
$db = mysql_select_db("test") or die(mysql_error());
if($_POST) {
if(!empty($_POST['Cargo'])) {
$sql_cargo = "`IDCargo` = '".$_POST['Cargo']."'";
$sql = $sql_cargo;
$order_cargo = 'IDCargo ASC, ';
}
if($_POST['Filhos'] == N) {
$sql_filhos = "`Filhos` = '0'";
if(!empty($sql)) {
$sql = $sql.' OR '.$sql_filhos;
} else {
$sql = $sql_filhos;
}
$order_filhos = 'Filhos ASC, ';
}
if(!empty($_POST['Sexo'])) {
$sql_sexo = "`Sexo` = '".$_POST['Sexo']."'";
if(!empty($sql)) {
$sql = $sql.' OR '.$sql_sexo;
} else {
$sql = $sql_sexo;
}
if($_POST['Sexo'] == 'M') {
$order_sexo = 'Sexo ASC, ';
} else {
$order_sexo = 'Sexo DESC, ';
}
}
if(!empty($_POST['EstadoCivil'])) {
$sql_estadocivil = "`EstadoCivil` = '".$_POST['EstadoCivil']."'";
if(!empty($sql)) {
$sql = $sql.' OR '.$sql_estadocivil;
} else {
$sql = $sql_estadocivil;
}
// Aqui é que está a magica ( foi o que eu disse de definir criterios, imagino que o criterio seja nesta ordem : pessoas solteiras / divorciadas / casadas)
if($_POST['EstadoCivil'] == 'C') {
$order_estadocivil = 'EstadoCivil DESC, ';
} else {
$order_estadocivil = 'EstadoCivil ASC, ';
}
}
echo $sql_montada = "SELECT * FROM `teste` WHERE 1=1 AND (".$sql.") ORDER BY ".$order_cargo.$order_sexo.$order_filhos.$order_estadocivil." ID ASC";
$exe = mysql_query($sql_montada) or die(mysql_error()); // o 1=1 é para evitar qualquer problema. OUTRA COISA, A POSIÇÃO DO ORDER BY DEFINIRÁ A POSIÇÃO NOS RESULTADOS - O ID ASC classifica as pessoas com cadastro antigo primeiro.
while($row = mysql_fetch_array($exe)) { ?>
<br />
ID: <? echo $row['ID']; ?><br />
ID do Cargo: <? echo $row['IDCargo']; ?><br />
Sexo: <? if($row['Sexo'] == 'M') { echo "Masculino"; } elseif($row['Sexo'] == 'F') { echo "Feminino"; } else { echo "Indeciso"; } ?><br />
Filhos: <? echo $row['Filhos']; ?><br />
Estado Civil: <? if($row['EstadoCivil'] == 'C') { echo "Casado(a)"; } elseif($row['EstadoCivil'] == 'S') { echo "Solteiro(a)"; } elseif($row['EstadoCivil'] == 'D') { echo "Divorciado(a)"; } else { echo "Não respondeu pois não quis se comprometer"; } ?><br />
<hr />
<?
}
} else {
?>
<form method="post" action="teste.php">
<label for="Cargo">Cargo</label>
<select name="Cargo" id="Cargo">
<option value="" selected="selected">Indiferente</option>
<option value="1">Cargo Qualquer 1</option>
<option value="2">Cargo Qualquer 2</option>
</select>
<br />
<label for="Sexo">Sexo</label>
<select name="Sexo" id="Sexo">
<option value="" selected="selected">Indiferente</option>
<option value="M">Masculino</option>
<option value="F">Feminino</option>
</select>
<br />
<label for="Filhos">Filhos</label>
<select name="Filhos" id="Filhos">
<option value="" selected="selected">Indiferente</option>
<option value="N">Sem Filhos</option>
</select>
<br />
<label for="EstadoCivil">Estado Civil</label>
<select name="EstadoCivil" id="EstadoCivil">
<option value="" selected="selected">Indiferente</option>
<option value="C">Casado(a)</option>
<option value="D">Divorciado(a)</option>
<option value="S">Solteiro(a)</option>
</select>
<br />
<input type="submit" />
</form>
<?
}
?>
usando o seguinte sql
CREATE TABLE `teste` (
`ID` bigint(1) NOT NULL auto_increment,
`IDCargo` bigint(20) default NULL,
`Sexo` enum('M','F') collate latin1_general_ci default NULL,
`EstadoCivil` enum('S','C','D') collate latin1_general_ci default NULL,
`Filhos` bigint(20) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
INSERT INTO `teste` VALUES (1,1,'M','C',0);
INSERT INTO `teste` VALUES (2,1,'F','S',0);
INSERT INTO `teste` VALUES (3,2,'M','C',0);
INSERT INTO `teste` VALUES (4,2,'F','S',2);
só serve como exemplo mesmo esse codigo..
espero ter ajudado, existem ainda outras formas de fazer também, se desse jeito não resolver, posta ai, =]
guezth, vamos tentar um exemplo pratico.
Quero realizar uma pesquisa com os seguintes critérios:
intCargoPretendido = 2;
blnSexo = 0
strEstadoCivil = C
intFilhos = 0
//------------------------------------------------
Vamos supor que a tabela esta preenchida com os seguintes dados, sendo: intCandidatoId | intCargoPretendido | blnSexo | strEstadoCivil | intFilhos:
1 | 2 | 1 | C | 0 | (Atende a todos, menos sexo pois é mulher) Avaliacao = 3
2 | 2 | 0 | C | 0 | (Atende a todos os requisitos) Avaliacao = 4
3 | 2 | 0 | S | 2 | (Não atende a estado civil 'S' e tem 2 filhos) Avaliacao = 2
4 | 4 | 0 | C | 0 | (Não atende somente Cargo) Avaliacao = 3
//------------------------------------------------
No seu código (pelo que eu entendi, eu não cheguei a executar ele) ele iria exibir da seguinte forma:
2 | 2 | 0 | C | 0 | (Atende a todos os requisitos) Avaliacao = 4 (Legal correto)
1 | 2 | 1 | C | 0 | (Atende a todos, menos sexo pois é mulher) Avaliacao = 3 (até aqui tranquilo)
3 | 2 | 0 | S | 2 | (Não atende a estado civil 'S' e tem 2 filhos) Avaliacao = 2 (aqui ele iria trazer este de maneira errada)
4 | 4 | 0 | C | 0 | (Não atende somente Cargo) Avaliacao = 3
//------------------------------------------------
Isto porque eu não posso dizer qual críterio é mais ou menos importante na hora de fazer o ORDER BY, e sim classificar aqueles que atendem a MAIS CRITERIOS indiferente de quais são eles.....
Além deste detalhe (me corrija se eu estiver falando bobagem) eu tambem gostaria de mostrar o percentual que cada candidato teve na consulta, ou seja
Candidato 01 => 80% dos critérios atendidos
Candidato 02 => 65% dos critérios atendidos
E se eu classificar apenas eu não tenho esta informação, eu estava pensando num SQL mais ou menos assim:
SELECT intCandidatoId,strNome,Count(strNome = 2 or blnSexo = 0 OR intFilhos = 0) AS Avaliacao
FROM rh_candidatos
ORDER BY Avaliacao;
A sintaxe não gera erro, porem não traz um resultado correto.....
pelo sql mesmo você consegue...
a unica coisa é você definir o que vai ser o criterio acho que você pode fazer isso sem usar nenhuma função ... basta usar o order by...
por exemplo...
estou procurando candidatos do sexo feminino, viuvas, sem filhos...
faz assim:
select * from
tabelaWHEREintCargoPretendido= 5 ORDER BYblnSexoASC,srtEstadoCivilDESC,intFilhosASCisso deverá retornar o que procurei... =]