Ir para conteúdo

Arquivado

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

Diego Somar

Consulta MySQL - Cláusula WHERE

Recommended Posts

Amigos, a minha dúvida parece simples, mas possui uma pegadinha que não consigo resolver de jeito nenhum. Preciso de ajuda superior.

Eis a tabela de demonstração:

+-------------+----------------+-----------------+
|     id      |     coluna1    |     coluna2     |
+-------------+----------------+-----------------+
|      1      |       7        |        1        |
+-------------+----------------+-----------------+
|      2      |       7        |        2        |
+-------------+----------------+-----------------+
|      3      |       7        |        3        |
+-------------+----------------+-----------------+
|      4      |       7        |        4        |
+-------------+----------------+-----------------+
|      5      |       5        |        1        |
+-------------+----------------+-----------------+
|      6      |       5        |        2        |
+-------------+----------------+-----------------+
|      7      |       5        |        3        |
+-------------+----------------+-----------------+
|      8      |       5        |        4        |
+-------------+----------------+-----------------+





O que preciso é pegar TODOS OS REGISTROS, onde coluna1 seja diferente de 7 e coluna2 seja diferente de 2, no mesmo registro. Também preciso que coluna1 seja diferente de 5 e coluna2 seja diferente de 4, também no mesmo registro.

Ou seja, executando uma consulta que retorne os registros de ID:
1,3,4,5,6,7

A consulta não pode retornar o id 2 pois no mesmo registro coluna1 é igual a 7 e coluna2 é igual a 2.
Também não pode retornar o id 8, pois no mesmo registro coluna1 é igual a 5 e coluna2 é igual a 4.

Montei a seguinte consulta:

SELECT * FROM tabela WHERE (coluna1 <> 7 AND coluna2 <> 2) AND (coluna1 <> 5 AND coluna2 <> 4)





A consulta acima não retorna nenhum resultado, pois o computador entende:
coluna1 <> 7, então não retorna os registros de id 1 até 4, independente da coluna2.

Também vai limar os ids de 5 a 8, pois estamos pedindo coluna1 <> 5.

É aí que está a pegadinha.

Agradeço à todos que puderem ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que preciso é pegar TODOS OS REGISTROS, onde coluna1 seja diferente de 7 e coluna2 seja diferente de 2, no mesmo registro. Também preciso que coluna1 seja diferente de 5 e coluna2 seja diferente de 4, também no mesmo registro.

 

confuso ...

 

tente

 


SELECT * FROM tabela 
WHERE ((NOT (coluna1 = 7 AND coluna2 = 2)) 
       OR
       (NOT (coluna1 = 5 AND coluna2 = 4)))

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 outra possibilidade:

select * from teste2 where id not in(
(select id from teste2 where coluna1=7 and coluna2=2),
(select id from teste2 where coluna1=5 and coluna2=4))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Diego!

 

reproduzi sua tabela e consegui trazer apenas os dados que solicitou.

apenas alterei seu operador "and" por "or".

 

Tente aí!

 

Abraço.

 

R. SELECT * FROM testando WHERE (col1 <> 7 or col2 <> 2) AND (col1 <> 5 or col2 <> 4)

Compartilhar este post


Link para o post
Compartilhar em outros sites

À todos, obrigado pelas respostas.

A solução do Orlando funciona. Precisei de alguns minutos para entender a real diferença no resultado da query que eu tinha feito pela query que o Orlando fez. Rabisquei e entendi. Para facilitar o entendimento dos demais que possam ter a mesma dúvida, segue:

 

(referência da tabela postada inicialmente)
ID: 1
COL1: 7
COL2: 1

Rodando a sua Query:

 

SELECT * FROM testando WHERE (col1 <> 7 or col2 <> 2) AND (col1 <> 5 or col2 <> 4)

 

Primeiro Parêntesis:
col1 != 7 = false
col2 != 2 = true
então: (col1 != 7 or col2 != 2) = ( false or true ) = true

Segundo Parêntesis:
col1 != 5 = true
col2 != 4 = true
então: (col1 != 5 or col2 != 4) = ( true or true ) = true
A condição inteira é:
(true) and (true) = true
Então ele vai retornar o primeiro registro, como esperado.

Indo até o segundo registro:
ID: 2
COL1: 7
COL2: 2

Primeiro Parêntesis:
col1 != 7 = false
col2 != 2 = false
então: (col1 != 7 or col2 != 2) = ( false or false ) = false

Segundo Parêntesis:
col1 != 5 = true
col2 != 4 = true
então: (col1 != 5 or col2 != 4) = ( true or true ) = true
A condição inteira é:
(false) and (true) = false
Então ele NÃO vai retornar o segundo registro, como esperado.

E assim por diante.

Mais uma vez obrigado pela resposta!

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.