Selecione da tabela dependendo de entradas em outra tabela

votos
5

Esta é a configuração:

Tabela A tem uma ligação a tabela B. Existem várias entradas (0 a n) na tabela B, que podem ter uma ficha correspondente na tabela A.

Como faço para formar uma consulta que me dá um registro da tabela A apenas se uma certa quantidade de registros correspondentes existe na tabela B?

Exemplo:

Tabela A tem roupas nele. Tabela B tem atributos para vestuário.

Tabela B tem uma chave estrangeira para a tabela A, de modo que seria algo parecido com isto:

id  fid_clothing1  attributeA
id  fid_clothing1  attributeB
id  fid_clothing1  attributeC
id  fid_clothing2  attributeA
id  fid_clothing2  attributeB

Agora, eu quero apenas as roupas que têm atributo attributeAE attributeBE attributeC. Este não é um problema se eu fizer um OR-consulta, mas eu não posso simplesmente fazer algo como:

SELECT * from tableA
LEFT JOIN tableB on tableB.fid_cloting = tableA.id
WHERE attribute='A' AND attribute='B' AND attribute='C'

Esta condição nunca vai avaliar a verdade. Como faço isso?

Publicado 26/08/2009 em 23:34
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

Você poderia fazê-lo com 3 associações internas ... isto me dar fileiras uma mesa que tenham os atributos que eu quero

SELECT A.id FROM tableA A
INNER JOIN tableB BA ON A.id = BA.fid_clothing AND BA.Attribute='A'
INNER JOIN tableB BB ON A.id = BB.fid_clothing AND BB.Attribute='B'
INNER JOIN tableB BC ON A.id = BC.fid_clothing AND BC.Attribute='C'
GROUP BY A.id
Respondeu 26/08/2009 em 23:52
fonte usuário

votos
1

Gostaria de usar GROUP_CONCATpara buscar uma única linha de todos os atributos para uma determinada peça de roupa:

SELECT id,GROUP_CONCAT(attribute order by attribute) as Attributes 
FROM tableB 
GROUP BY id;

Dar algo como:

| id | Attributes |
|  1 | A,B,C      |

A partir deste conjunto de resultados, você pode selecionar os ids para o qual o atributo concatenado combinados o conjunto de atributos que você estava procurando.

select id de MyConcatenatedResults onde Atributos = 'A, B, C'

Respondeu 27/08/2009 em 10:58
fonte usuário

votos
0

Outra maneira de fazer isso é o seguinte, o que requer zero, junta-se, mas uma sub-consulta aninhada ... têm tentativas isso em um banco de dados fictício, e parece fazer o trabalho. Espero que ajude.

SELECT * 
DE tableA A 
WHERE id IN ( 
              clothing_id SELECIONAR
              DE tableB B
              ONDE
                atributo = "A"
                Ou atributo = "B"
                OU atributo = "C"
              GROUP BY clothing_id
              TENDO contagem (*) = 3
            )
Respondeu 27/08/2009 em 09:06
fonte usuário

votos
0

Pode ser este um .. tem que tentar

SELECT * FROM TABLEA a, TABLE b 
WHERE a.id = b.clothing_id 
AND a.id in (SELECT clothing_id from TABLEB where attribute = 'A' AND clothing_id = a.id
UNION select clothing_id from TABLEB where attribute = 'B' AND clothing_id = a.id
UNION select clothing_id from TABLEB where attribute = 'C' AND clothing_id = a.id)
Respondeu 27/08/2009 em 04:31
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more