Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa Tarde Amigos,
Estou com uma dúvida, creio que seja coisa fácil de resolver.
Estou querendo gerar um combobox com algumas restrições:
Tenho um tabela assim +/-
/applications/core/interface/imageproxy/imageproxy.php?img=http://agenciaskills.com.br/tabela.jpg&key=c0c347388131b56bea2c5587170e41c7152bbd00e80222c4c70c81bfd2284c62" alt="tabela.jpg" />
Logo preciso gerar um combobox que faça uma consulta na tabela e verifique linha por linha,
Por exemplo, a amostra do sistema de SP é 2, se duas pessoas tiverem com status 2 ele não deverá mostrar no combobox, ai no caso de RJ a amostra é 15, porém apenas uma pessoa esta com status 2, logo ele deverá aparecer no combobox.
Meu Script se encontra assim:
<option value="" selected="selected">Selecione</option>
<?php
$consulta = mysql_query("SELECT * FROM tabela WHERE status=0 GROUP BY uf ORDER BY uf");
while($estado = mysql_fetch_array($consulta)){ ?>
<option value="<?php echo $estado['UF']; ?>"><?php echo $estado['UF']; ?></option>
<?php }?>
</select>Amigo, Seria +/- isso ó:
SELECT COUNT(status) FROM tabela WHERE status=2 GROUP BY uf
Agora preciso fazer outra consulta dentro e passar o valor do status, assim +/-
SELECT * FROM tabela WHERE qtdStatus<>amostra
Essa sua tabela tem algum ID?
Poderia ficar mais ou menos assim:
SELECT COUNT(status) FROM tabela WHERE status=2 AND idTabela IN (SELECT idTabela FROM tabela WHERE qtdStatus<>amostra) GROUP BY uf
>
Amigo, Seria +/- isso ó:
SELECT COUNT(status) FROM tabela WHERE status=2 GROUP BY uf
Agora preciso fazer outra consulta dentro e passar o valor do status, assim +/-
SELECT * FROM tabela WHERE qtdStatus<>amostra
Hmm ok, eu acho que entendi, tenta fazer isso:
select COUNT(status) from tabela where status=2 AND uf = "sp"
Dae basta fazer um if, se retornar mais de um 1 com status 2 não mostra, se não mostra.
Se quiser automatizar a busca dos estados basta jogar a consulta dentro de um while e fazer uma pesquisa dos estados antes e em vez de "sp" coloca a variável.
Se não é isso que você quer explica melhor, porque sinceramente, está difícil de entender...
Guilherme, tentei fazer o que você sugeriu porém não funcionou ..
Bacsh, seria o seguinte cara:
Preciso fazer uma consulta para contar quantas pessoas de SP por exemplo acessaram o sistema, pensa que são 15 pessoas de SP,
e apenas 2 acessaram, então deve aparecer no meu combobox as pessoas de SP, caso as 15 tenham acessado a pesquisa elas não deveram aparecer .. e assim por diante com os outros estados ..
>
Bacsh, seria o seguinte cara:
Preciso fazer uma consulta para contar quantas pessoas de SP por exemplo acessaram o sistema, pensa que são 15 pessoas de SP,
e apenas 2 acessaram, então deve aparecer no meu combobox as pessoas de SP, caso as 15 tenham acessado a pesquisa elas não deveram aparecer .. e assim por diante com os outros estados ..
Para consultar quantas pessoas de SP acessaram o sistema:
SELECT COUNT(nome) FROM tabela WHERE status=2 AND uf="SP"
Para aparecer essas pessoas no combobox basta retirar o count e fazer o while assim como você já tinha feito.
Para verificar em todos os estados basta você remover isso aqui: AND uf="SP".
Assim você vai pesquisar em todos os estados, cara é muito simples, não sei qual é sua dificuldade...
Amigo, tem que fazer um count geral entende, dentro do while ..
Fazer aparecer só quem tem status 0 não resolve???
Não amigo, pois as vezes a amostra dos clientes de GO é 30, porém no banco tem 50 de GO.
Logo se 30 entraram no sistema, tem que sair do combobox o GO.
Deixa eu ver se entendi, no Combo você não quer os estados cuja amostra seja igual à quantidade de usuários daquele estado?
em programação, você tem que ter [inline]$amostra[/inline] linhas contendo o [inline]$status = 2[/inline] ??
Se eu entendi direito, é isso aqui:
mysql> select nome, uf from temp where amostra > (select count(t.status) from temp as t where t.uf = uf and t.status = 2 group by t.status limit 1);
+---------+------+
| nome | uf |
+---------+------+
| rafael | rj |
| jonatas | rj |
+---------+------+
2 rows in set (0,00 sec)
mysql> select * from temp;
+---------+------+--------+---------+
| nome | uf | status | amostra |
+---------+------+--------+---------+
| bruno | sp | 0 | 2 |
| maria | sp | 2 | 2 |
| josé | sp | 2 | 2 |
| rafael | rj | 0 | 15 |
| jonatas | rj | 2 | 15 |
+---------+------+--------+---------+
5 rows in set (0,00 sec)
Vou explicar de novo hahahha,
Pensa assim amigo, tenho um banco de dados com vários estados.
Cada estado pode ter N usuários, vamos supor que são paulo tenha 30 usuários, porém a amostra de SP é 15 por exemplo.
Ou seja no meu combobox não poderá aparecer SP caso 15 usuários de SP ja tenham acessado o sistema.
Para eu saber que o usuário acessou o sistema eu fiz uma query que quando ele loga é colocado 2 na coluna status.
Agora vamos supor outro UF, de GO por exemplo, lá tem uns 22 usuários e a amostra é 12, ou seja ..
Caso esses 12 tenham acessado o sistema, não poderá aparecer no combobox também, e assim por diante.
Conforme imagem abaixo a opção GO deverá sumir ..
/applications/core/interface/imageproxy/imageproxy.php?img=http://agenciaskills.com.br/img.jpg&key=f66891df632dde7dd2aa9323b26ef8bd7069cbfea3363fe7ab14a24c998388cf" alt="img.jpg" />
Testou a consulta?
O que seria temp, t.status e t na consulta que você me passou ?
mysql> select nome, uf from temp where amostra > (select count(t.status) from temp as t where t.uf = uf and t.status = 2 group by t.status limit 1);O que seria temp, t.status e t na consulta que você me passou ?
temp é uma tabela temporária contendo exatamente os resultados que você trouxe no primeiro post...
>
select * from temp;
+---------+------+--------+---------+
| nome | uf | status | amostra |
+---------+------+--------+---------+
| bruno | sp | 0 | 2 |
| maria | sp | 2 | 2 |
| josé | sp | 2 | 2 |
| rafael | rj | 0 | 15 |
| jonatas | rj | 2 | 15 |
+---------+------+--------+---------+
5 rows in set (0,00 sec)
[inline]t[/inline] é um alias (apelido) para [inline]temp[/inline] da subconsulta se diferenciar da [inline]temp[/inline] da consulta principal.
[inline]t.status[/inline] é o campo [inline]status[/inline] da tabela [inline]temp[/inline] que está referenciada sob o apelido [inline]t[/inline].
Correto,
deixei assim e não funcionou.
Não aparece nenhum UF agora ..
$consulta = mysql_query("select * from tabela where amostra > (select count(t.statusPesquisa) from tabela as t where t.uf = uf and t.statusPesquisa = 2 group by t.statusPesquisa limit 1)");
Tentei assim e agora ele mostra os estados, porém deveria sair SP, pois SP a quantidade de amostras foi concluída.
$consulta = mysql_query("select * from tabela where amostra <= (select count(t.statusPesquisa) from tabela as t where t.uf = uf and t.statusPesquisa = 2) group by uf order by uf");Porque você não faz um passo-a-passo?
Exemplo:
Consulta todos os estados usando o DISTINCT e já pega o valor do amostra de cada um, depois faz um while com esse resultado para pesquisar cada estado o número de usuários. Então faz um if com uma pesquisa de count para verificar se o número é menor ou maior que a amostra.
Colocando em prática:
$sql = "SELECT DISTINCT(uf) AS uf FROM tabela ORDER BY uf DESC";
// aqui em cima pesquisa todos os estados e suas amostras
$bd->query($sql);
$registro = 0;
while ($registro<$bd->numeroDeRegistros()){
//aqui em cima percorre cada estado
$varQualquer = $bd->leRegistro();
$amostra = $varQualquer ["amostra"];$sql2 = "SELECT COUNT(nome) FROM tabela WHERE status=2 AND uf='$uf'";
//aqui em cima conta quantos usuários com o status 2 tem no estado que o while está percorrendo
$count = mysql_fetch_array($sql2 )
if ($amostra > $count){
//aqui em cima ele verifica se a amostra do estado é menor que a quantidade de usuários com o status 2
echo "$uf";
//aqui em cima ele imprimi estado para aparecer no seu combobox
}
else{
}
$registro++;
}O que precisava exatamente era contar quantas pessoas existem com status 2 de cada UF que se encontra na coluna statusPesquisa,
Depois de pegar a quantidade de amostra cada UF, depois verificar se o número de efetivos é menor que o número da amostra, caso for ele entra dentro do combobox, caso contrário não.
Por exemplo estado SP
Efetivos: 19
Amostra: 20
OK, entra no combobox pois a amostra não foi batida ainda
------------------------------------------------------------------
Por exemplo estado RJ
Efetivos: 22
Amostra: 22
Não entra, pois a amostra foi batida.
---------------------------------------------------
Por exemplo estado PA
Efetivos: 17
Amostra: 16
Não entra, pois a amostra foi batida
>
O que precisava exatamente era contar quantas pessoas existem com status 2 de cada UF que se encontra na coluna statusPesquisa,
Depois de pegar a quantidade de amostra cada UF, depois verificar se o número de efetivos é menor que o número da amostra, caso for ele entra dentro do combobox, caso contrário não.
Por exemplo estado SP
Efetivos: 19
Amostra: 20
OK, entra no combobox pois a amostra não foi batida ainda
------------------------------------------------------------------
Por exemplo estado RJ
Efetivos: 22
Amostra: 22
Não entra, pois a amostra foi batida.
---------------------------------------------------
Por exemplo estado PA
Efetivos: 17
Amostra: 16
Não entra, pois a amostra foi batida
Ta cara no exemplo que eu dei ali faz isso, só que ele pesquisa de cada estado antes, a ordem dos fatores não altera o resultado, uma coisa que não entendi no que você falou é ali:
SP
Efetivos: 30
Amostra: 20
OK, entra no combobox pois a amostra não foi batida ainda
PA
Efetivos: 17
Amostra: 16
Não entra, pois a amostra foi batida
Como assim cara, em São Paulo o número de amostras é menor que os efetivos e você diz que bateu (seja lá o que isso significa) e depois em PA o número de amostras também é menor e não bateu? Como assim, cara sua lógica está completamente confusa, se você não sabe nem o que quer, vai ser difícil da gente te ajudar, porque você não está conseguindo se expressar.
PS: Vou colocar uns comentários no meu código para ver se lhe ajuda...
Pensa assim comigo amigo:
Vou dar um exemplo similar:
Pensa em uma balada,
Podem entrar pessoas de estados nela:
tem na fila 30 pessoas de SP, porém a casa suporta apenas 20 de SP.
Quando entrarem 20 de SP o segurança irá barrar o restante;
Para o estado não aparecer mais no combobox o número de efetivos tem que ser superior ou igual à amostra entende ..
E para o estado aparecer no combobox o número de efetivos tem que ser inferior à amostra.
Qual a saída disso aqui [inline]select uf, count(t.statusPesquisa) as efetivo from tabela as t where t.statusPesquisa = 2 group by t.statusPesquisa[/inline]?
Mostrou BA e 338 efetivo
e essa:
select uf, amostra, count(statusPesquisa) from tabela where statusPesquisa = 2 group by statusPesquisa
?
UF
BA
AMOSTRA
30
count(statusPesquisa)
338
Acho que é +/- isso amigo, porém esse 338 não sei de onde saiu ..
Perdão!! Erro meu. 338 é porquê você tem 338 registros cujo status é igual a 2.<br /><br />A consulta correta é
select uf, amostra, count(statusPesquisa) from tabela where statusPesquisa = 2 group by uf>
Pensa assim comigo amigo:
Vou dar um exemplo similar:
Pensa em uma balada,
Podem entrar pessoas de estados nela:
tem na fila 30 pessoas de SP, porém a casa suporta apenas 20 de SP.
Quando entrarem 20 de SP o segurança irá barrar o restante;
Para o estado não aparecer mais no combobox o número de efetivos tem que ser superior ou igual à amostra entende ..
E para o estado aparecer no combobox o número de efetivos tem que ser inferior à amostra.
Você editou o post porque antes tava:
Efetivos: 30
Amostra: 20
e depois você editou e colocou:
Efetivos: 19
Amostra: 20
:closedeyes:
No exemplo que você deu da balada, meu código faz isso, eu já coloquei os comentários, veja novamente.
Ou use o Join:
http://vivenciandoti.blogspot.com.br/2009/05/sql-uso-do-join-em-clausulas-select.html