Ir para conteúdo

POWERED BY:

Arquivado

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

Bru_ce

Select dentro de Select

Recommended Posts

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 +/-

 

 

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>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ..

 

img.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

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);

Compartilhar este post


Link para o post
Compartilhar em outros sites

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].

Compartilhar este post


Link para o post
Compartilhar em outros sites

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");
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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"];
//aqui em cima pega o valor da amostra de cada estado
$uf = $varQualquer ["uf"];
//aqui em cima pega o estado separamente

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

}

Cara deve ter alguns erros aew no meio, mas da para entender :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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