Ir para conteúdo

POWERED BY:

Arquivado

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

nTn

Seleção Múltipla WHERE IN

Recommended Posts

Bom dia, estou com um problema que não consigo resolver.

 

Tenho 3 tabelas como no exemplo abaixo:

Tabela1

ID

Nome

Endereco

 

Tabela2

ID

IDTabela1

Habilidade

 

Tabela3

ID

IDTabela1

Cargo

 

Bom, o meu problema é o seguinte. Gostaria de listar todos os itens da tabela 1 que tenham múltiplas habilidades. Por exemplo, (DIGITA, FALA INGLES, FALA FRANCES). Ou seja, preciso listar todas as pessoas que tenham essas 3 características, ou seja, não apenas 1 das 3, e sim as 3. E também a possibilidade de além de listar essas 3 habilidades, que tenham cargo X ou Y. Ou seja, nessa segunda seleção seria uma das opções selecionadas.

 

O que estou fazendo é um checkbox, onde o usuário seleciona o primeiro checkbox (cargo) todos os cargos desejados, e no segundo (habilidade), as habilidades desejadas. A diferença é q em cargo é qualquer um dos selecionados, mas nas habilidades, tem que ser todas!

 

Consegui fazer algo muito perto disso, mas qd mistura mais tabelas (no caso seriam mais de 20), começa a bagunçar tudo. Também estou usando o WHERE Campo IN (X, Y, Z) para fazer essa seleção.

 

Se alguém tiver alguma idéia, agradeceria basante.

 

Obrigado,

Bráulio Lorenzo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ser mais claro na minha dúvida.

 

Vou colocar aki alguns registros das tabelas:

 

Tabela1 (ID Nome Endereco)

1 João EnderecoJoao

2 José EnderecoJose

3 Juarez EnderecoJuarez

 

Tabela2 (ID Habilidade)

1 Digita

2 Fala Ingles

3 Fala Frances

4 Marceneiro

5 Ferragista

 

Tabela3 (ID IDPessoa IDHabilidade)

1 1 1

2 1 2

3 1 3

4 2 1

5 2 3

6 2 5

7 3 2

8 3 3

9 3 4

10 3 5

 

O que eu quero:

Exemplo 1: Pessoas que falam Ingles E falam frances

Resposta: Joao e Juarez

 

Exemplo 2: Pessoas que falam Ingles E que sejam marcineiro

Resposta: Juarez

 

Exemplo 3: Pessoas que falem Frances E sejam ferragista

Resposta: José e Juarez

 

O problema é que se uso para o exemplo 1:

SELECT T1.Nome FROM Tabela1 T1 LEFT JOIN Tabela2 T3 ON T1.ID = T3.IDPessoa WHERE T3.IDHabilidade IN (2, 3)

Ele vai procurar pessoas que falam ingles OU frances. E preciso que seja ingles E frances

 

Essa é minha maior dificuldade!

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

usando o operador IN é o mesmo que usar o operador OR, ou seja,

WHERE T3.IDHabilidade IN (2, 3) a farinha é mesma que WHERE T3.IDHabilidade = 2 OR T3.IDHabilidade = 3, só muda a forma do preparo

 

muda para o operador AND e vai pro abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples:

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade IN (2, 3)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é o exemplo que citei:

SELECT T1.Nome FROM Tabela1 T1 LEFT JOIN Tabela2 T3 ON T1.ID = T3.IDPessoa WHERE T3.IDHabilidade IN (2, 3)

 

Não serve, pois ele está verificando Habilidade = 2 OU 3. Preciso habilidade 2 E 3!

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é o exemplo que citei:

SELECT T1.Nome FROM Tabela1 T1 LEFT JOIN Tabela2 T3 ON T1.ID = T3.IDPessoa WHERE T3.IDHabilidade IN (2, 3)

 

Não serve, pois ele está verificando Habilidade = 2 OU 3. Preciso habilidade 2 E 3!

 

[]s

Amigo, tem que funcionar.. no seu select você nao usou a Tabela3. você apelidou sua Tabela2 como T3. Mas ele tá usando a Tabela2.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, desculpe a falha, agora que entendi.. faça assim:

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 2

 

union all

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também não funciona. O resultado é o mesmo do usando WHERE IN.

 

O grande problema é q preciso saber as pessoas q tenham IDHabilidade 2 e 3, e não 2 ou 3.

 

Das 2 formas listou todas as pessoas, sendo que apenas João e Juarez tem as habilidades 2 e 3, mas ainda listou o José, que tem apenas a habilidade 3.

 

[]s

 

Amigo, desculpe a falha, agora que entendi.. faça assim:

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 2

 

union all

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que o melhor a se fazer então é usar agrupamento.

 

SELECT IDPessoa FROM Tabela3 GROUP BY IDPessoa
HAVING (IDHabilidade = 2) AND (IDHabilidade = 3)

 

Essas serão as que falam ingles e frances.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também não funciona. O resultado é o mesmo do usando WHERE IN.

 

O grande problema é q preciso saber as pessoas q tenham IDHabilidade 2 e 3, e não 2 ou 3.

 

Das 2 formas listou todas as pessoas, sendo que apenas João e Juarez tem as habilidades 2 e 3, mas ainda listou o José, que tem apenas a habilidade 3.

 

[]s

 

Amigo, desculpe a falha, agora que entendi.. faça assim:

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 2

 

union all

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 3

Amigo, veja bem que são 2 selects com union.. precisa colocar igual tá lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, fiz com UNION e 2 tabelas. Igualzinho você passou, mas UNIOU é OU e não E. Ele vai unir as duas tabelas, sendo o resultado igual ao WHERE IN.

 

Também não funciona. O resultado é o mesmo do usando WHERE IN.

 

O grande problema é q preciso saber as pessoas q tenham IDHabilidade 2 e 3, e não 2 ou 3.

 

Das 2 formas listou todas as pessoas, sendo que apenas João e Juarez tem as habilidades 2 e 3, mas ainda listou o José, que tem apenas a habilidade 3.

 

[]s

 

Amigo, desculpe a falha, agora que entendi.. faça assim:

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 2

 

union all

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei fazer como sugeriu e não funcionou. O único que tive que acrescentar é o GROUP BY IDPessoa, IDHabilidade

 

Está difícil achar alguma solução.

 

[]s

 

Acho que o melhor a se fazer então é usar agrupamento.

 

SELECT IDPessoa FROM Tabela3 GROUP BY IDPessoa
HAVING (IDHabilidade = 2) AND (IDHabilidade = 3)

 

Essas serão as que falam ingles e frances.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma solução seria essa:

 

SELECT id_pessoa FROM tb_pessoa_habilidade where (id_habilidade = 2) OR (id_habilidade = 3)
GROUP BY id_pessoa HAVING COUNT(DISTINCT id_habilidade) > 1

 

Obs: Realmente a do outro post não funciona. Foi mal!

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, fiz com UNION e 2 tabelas. Igualzinho você passou, mas UNIOU é OU e não E. Ele vai unir as duas tabelas, sendo o resultado igual ao WHERE IN.

 

Também não funciona. O resultado é o mesmo do usando WHERE IN.

 

O grande problema é q preciso saber as pessoas q tenham IDHabilidade 2 e 3, e não 2 ou 3.

 

Das 2 formas listou todas as pessoas, sendo que apenas João e Juarez tem as habilidades 2 e 3, mas ainda listou o José, que tem apenas a habilidade 3.

 

[]s

 

Amigo, desculpe a falha, agora que entendi.. faça assim:

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 2

 

union all

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 3

você está enganado amigo.. union traz os 2.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa foi a solução que havia encontrado para apenas uma query simples, mas qd comecei a colocar mais parâmetros, ele bagunçou tudo. Por isso estava querendo saber se haveria outra possibilidade. Consegui resolver o problema, mas fazendo algumas coisas no código, e não só no SQL. Se conseguisse apenas no SQL seria o ideal para mim.

 

[]s

 

Uma solução seria essa:

 

SELECT id_pessoa FROM tb_pessoa_habilidade where (id_habilidade = 2) OR (id_habilidade = 3)
GROUP BY id_pessoa HAVING COUNT(DISTINCT id_habilidade) > 1

 

Obs: Realmente a do outro post não funciona. Foi mal!

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Realmente não funciona. Fiz o teste e o resultado é o mesmo que o WHERE IN. Experimente aplicar aí, mesmo no Access q verá o q está ocorrendo.

[]s

 

Sim, fiz com UNION e 2 tabelas. Igualzinho você passou, mas UNIOU é OU e não E. Ele vai unir as duas tabelas, sendo o resultado igual ao WHERE IN.

 

Também não funciona. O resultado é o mesmo do usando WHERE IN.

 

O grande problema é q preciso saber as pessoas q tenham IDHabilidade 2 e 3, e não 2 ou 3.

 

Das 2 formas listou todas as pessoas, sendo que apenas João e Juarez tem as habilidades 2 e 3, mas ainda listou o José, que tem apenas a habilidade 3.

 

[]s

 

Amigo, desculpe a falha, agora que entendi.. faça assim:

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 2

 

union all

 

Select Tabela1.* from Tabela1 inner join Tabela3

on tabela1.id = tabela3.idpessoa

where IDHabilidade = 3

você está enganado amigo.. union traz os 2.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendi muito o que voce falou mas tudo bem.

Fiz os testes e funciona como voce queria.

 

Se quiser deixar dinamico é simples, basta entender como funciona a query.

 

where (id_habilidade = 2) OR (id_habilidade = 3) -- seleciona as habilidades
GROUP BY id_pessoa -- agrupa o que for mostrar 
HAVING COUNT(DISTINCT id_habilidade) > 1 -- número de habilidade - 1

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.