Eu tenho uma photos
tabela, uma tags
tabela e uma tabela de bridge chamada photos_tags
. Imagine que há uma foto que foi marcada com dog
, cat
, e bird
. Isso significa que haverá 1 linha em photos
, 1 linha em tags
, e 3 linhas em photos_tags
.
Estou tentando escrever uma declaração SQL para buscar todas as 3 tags se uma delas corresponder. Cheguei até aqui:
select distinct p.photo_id, t.tag from photos p
join photos_tags pt using (photo_id)
join tags t on pt.tag_id = t.tag_id and t.tag = 'dog'
Mas isso só retorna as linhas onde tag = 'dog'
.
Existe alguma maneira de realizar o que estou tentando fazer?
Primeiro identifique todas as fotos que têm a etiqueta "dog", o que você já fez, mas vou reescrever para o CTE
Agora use isso para filtrar sua consulta e mostrar tudo
tags
ophoto_id
que foi exibido:@JNevill forneceu uma resposta que vou marcar como a solução correta. No interesse da completude, também vou compartilhar uma maneira alternativa que encontrei e que também parece funcionar:
Assumindo uma implementação padrão muitos-para-muitos , espero que isso seja o mais rápido e simples:
Basta fazer o "Ring around the Rosie" uma vez.
Pode ser feito da seguinte forma: