dúvida query mysql

4 respostas
M

Opa…

Tenho algumas tabelas que se relacionam entre si e preciso fazer uma query do tipo:

“select * from tabela_filha where ‘todas as colunas FLAG forem true’ and id_pai = 123”

Como que eu coloco essa restrição que deve atender todos os registros dos filhos??

Abs

4 Respostas

drsmachado

Use o operando AND.

SELECT * FROM filha WHERE filha.col1 = true AND filha.col2 = true ...

Não se esqueça, como está pesquisando em mais de uma tabela, utilize um JOIN

M

Não…isso não funciona e não é isso que eu quero!

Eu tenho 2 tabelas e preciso retornar o objeto, apenas se TODOS os filhos estiverem com a flag true em determinada coluna:

Se eu fizer:

select * from pai
inner join filha on pai.id_pai = filha.id_pai
where filha.colunaFlag = true

E vamos supor que a filha tenham 10 registros: 9 deles estão com FALSE e 1 está com TRUE…ele vai me retornar alguma coisa e não deveria retornar nada pq eu preciso apenas se TODOS estiverem TRUE.

Entendeu?

drsmachado

Camarada, se você nunca estudou operadores lógicos, aí vai uma pequena luz:
AND é o operador lógico que retorna TRUE se e somente se, todos os operandos forem verdadeiros.
No caso, seria como o && do java e C++

SELECT * from nome where nome_proprio = "Joao" AND sobrenome = "Silva";

Só retornaria os registros em que nome_proprio seja Joao (da maneira como está escrito) e sobrenome seja Silva (da maneira como está escrito). Caso uma das duas não seja verdadeira, o select passa à próxima linha, até o fim da tabela.

Quanto ao que você quer, desculpe, a vida é assim, nem tudo que se quer se consegue, isso vale tanto para quem vai atrás como para aqueles que esperam cair do céu.

A questão é que o objetivo do select é verificar justamente o inverso. Ou seja, você não quer pesquisar e retornar algo que esteja como TRUE, quer que o select verifique se existe alguma coisa como FALSE.

Para quem conhece a estrutura de funcionamento de um banco de dados, sabe que um select é feito para buscar alguma coisa, lendo linha a linha e utilizando regras estipuladas (where, or, and, in, between, order by, group by, etc).
Neste caso, você teria que condicionar o select principal (para trazer o que você quer) à duas condições, a primeira com dois counts, o primeiro, contando o total de registros e o segundo contanto todos os registros true. A segunda, se e somente se o count de registros seja igual ao count de true.

Isso significa que você precisa fazer um select com if de subselects…

Eu optaria por uma stored procedure…

tondatto

Ou pode fazer assim:

SELECT * FROM pai p INNER JOIN filha f ON p.id_pai = f.id_pai WHERE NOT EXISTS (SELECT * FROM filha WHERE flag = FALSE AND id_pai = p.id_pai)

Criado 23 de setembro de 2011
Ultima resposta 23 de set. de 2011
Respostas 4
Participantes 3