Ir para conteúdo

POWERED BY:

Arquivado

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

renato9863

Select IN

Recommended Posts

Olá a todos

 

eu tenho a seguinte tabela:

 

atributo_id | user

----------------------

1 | 20

1 | 30

2 | 30

7 | 30

1 | 40

7 | 40

---------------------

 

 

 

Quando faço um select selecionado apenas os usuarios que tenham atributo_id "1":

 

SELECT * FROM tab_user,atributos_user WHERE atributos_user.user = tab_user.id AND atributos_user.atributo_id IN (1);

 

São exibidos os usuario 20, 30 e 40 (ok).

 

Mas quando eu quero exibir APENAS os usuários que tenham atributos "1 E 7" :

 

SELECT * FROM tab_user,atributos_user WHERE atributos_user.user = tab_user.id AND atributos_user.atributo_id IN (1,7); 

 

Ele também exibe o usuario 20 (deveria exibir apenas os usuarios de numero 30 e 40).

 

Alguém pode me dar dicas de como fazer isso ? Seja usando select in ou alguma outra alternativa.

 

Renato

Compartilhar este post


Link para o post
Compartilhar em outros sites

o Sql pede < atributos_user.atributo_id IN (1,7) >

 

Na lista

 

atributo_id | user

----------------------

1 | 20

1 | 30

2 | 30

7 | 30

1 | 40

7 | 40

 

Atendem

 

atributo_id | user

----------------------

1 | 20

1 | 30

7 | 30

1 | 40

7 | 40

Compartilhar este post


Link para o post
Compartilhar em outros sites

vuvuzela, discordo pois um registro não pode ser 1 E 7 ao mesmo tempo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Me confundi, ele disse: -Mas quando eu quero exibir APENAS os usuários que tenham atributos "1 E 7" :

 

Concordo com você. O usuario 20 não pode não ser exibido.

 

Ele vai retornar os usuarios que têm os atributos iguais a 1 e também 7 na tabela atributos. Nesse caso os usuarios 20, 30, 40 porém só uma vez o 30. Se ele não quiser que o 20 seja exibido terá que mexer nos relacionamentos. Afinal quem tem atributos é o usuário e não o contrário (atributos que tem usuário). É o típico N:N. Exige uma 3 tabela(associativa).

 

Um select que não retornaria seria:

SELECT * FROM tab_user, tab_user_atr, tab_atributos WHERE tab_user.id = tab_user_atr.id AND tab_atributos.id = tab_user_atr.id  AND tab_atributos.id IN (1,7); 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele também exibe o usuario 20 (deveria exibir apenas os usuarios de numero 30 e 40).

 

Nao, nao deveria.

 

 

Mas o select abaixo faz o q você quer, a cada elemento no 'in' você deve aumentar proporcinalmente o having count(*)

 

select user from
(select * from tabela where atributo_id in(1,7))z
group by user
having count(*) >=2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele também exibe o usuario 20 (deveria exibir apenas os usuarios de numero 30 e 40).

 

Nao, nao deveria.

 

 

Mas o select abaixo faz o q você quer, a cada elemento no 'in' você deve aumentar proporcinalmente o having count(*)

 

select user from
(select * from tabela where atributo_id in(1,7))z
group by user
having count(*) >=2
Belo Select, mas nesse caso o user 20 continuaria sem poder ter o atributo 1, por exemplo, mais de uma vez. Seria então uma prática pouco aconselhável, tendo em vista que a normalização do banco de dados se faz necessária.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá , eu continuo com esse meu problema sem solução, vou reformular a pergunta, tendo em vista que em uma lista ela gerou confusão..

 

Como deve ser meu sistema:

 

-Tenho uma TABELA DE USUARIOS

-Tenho uma TABELA DE ATRIBUTOS (existem diversos atributos e novos atributos podem ser adicionados)

-Tenho uma terceira TABELA (que tem o ID do Usuario e do Atributo) um usuário pode ter diversos atributos

 

Ocorre que preciso as vezes pesquisar usuários com determinados atributos.

 

Tenho a tabela abaixo:

 

atributo_id | user

---------------------------------------------

1 (fala ingles) | 20 (joão)

1 (fala ingles) | 30 (jose)

2 (fala italiano) | 30 (jose)

7 (fala espanhol) | 30 (jose)

1 (fala ingles) | 40 (maria)

7 (fala espanhol) | 40 (maria)

----------------------------------------------

* Coloquei os parenteses apenas para exemplificar o que seria a tabela.

 

 

Eu quero fazer uma consulta na tabela acima exibindo APENAS os usuários que falem por exemplo "ingles e espanhol" (ou seja falem os 2(dois) idiomas).

 

Antes de enviar minha dúvida tentei assim:
SELECT * FROM tab_user,atributos_user WHERE atributos_user.user = tab_user.id AND atributos_user.atributo_id = 1 AND atributos_user.atributo_id = 7 
(NÃO FUNCIONOU)
 

SELECT * FROM tab_user,atributos_user WHERE atributos_user.user = tab_user.id AND atributos_user.atributo_id IN (1,7); (NÃO FUNCIONOU)

Até agora não consegui nenhuma solução.

 

Alguém pode me dar dicas de soluções como eu poderia resolver isso ??? Mesmo que seja criar uma nova estrutura de tabelas no bd etc...

 

 

Obrigado a todos

 

Renato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você vai ter que mexer nos relacionamentos. Crie 3 tabelas, chamadas: usuario, atributo e atributos_user.

 

Na tabela de usuário você terá o id do usuário.(1 - José, 2 - João)

 

Na tabela atributos você terá o id do atributo.(Ex. 1 - Ingles, 2 - espanhol)

 

Na tabela atributos_user você terá o id tabela, uma foreing key do usuario e uma foreing key do atributo(Ex. 1 - 1 -1) traduzindo (1 - José - Ingles). poderia ser tambem (2 - 2 - 2) traduzindo (2 - João - espanhol), ou ainda (3 - 1 - 2) traduzindo (3 - José - espanhol)

 

Em SQL ficaria assim: (SELECT id_user FROM tb_user, tb_atributo, tb_atri_user WHERE id_user = fk_id_user AND id_atributo = fk_id_atributo AND id_atributo IN (1,2));

 

Esse select retornará o usuario José por exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma solução possível ....

 

 

SELECT *

FROM tab_user

where exists (SELECT null FROM atributos_user WHERE atributos_user.user = tab_user.id AND atributos_user.atributo_id = 1)

and exists (SELECT null FROM atributos_user WHERE atributos_user.user = tab_user.id AND atributos_user.atributo_id = 7)

Compartilhar este post


Link para o post
Compartilhar em outros sites

o select postado anteriormente por mim resolve seu problema.

 

Resolve sim , mas supõe que o id em questão seja chave, ou seja não tenha duplicidade, se tiver dois 1 baba, é uma solução mais limpa que a minha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah enfia um distinct xexelento la entao... mas tipo se tem linha duplicada ja ta errado desde o inicio , problema na modelagem.

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.