Ir para conteúdo

POWERED BY:

Arquivado

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

redstyle

[Resolvido] Pesquisando artigos que tenham 2 tags

Recommended Posts

Eu tenho 3 tabelas: emails, tags e email_tag.

 

emails tem as colunas: id e email

tags tem as colunas: id e tag

email_tag tem as colunas: email_id e tag_id

 

Dados da tabela emails:

1 - name_a@domain.com

2 - name_b@domain.com

3 - name_c@domain.com

 

Dados da tabela tags:

1 - tag_a

2 - tab_b

3 - tag_c

 

Dados da tabela email_tag:

1 - 1

1 - 2

1 - 3

2 - 2

2 - 3

3 - 1

3 - 2

 

Como selecionar somente emails que tenham a tag_a e tag_b? No caso os emails:

name_a@domain.com

name_c@domain.com

Tem a tag_a e tag_b

name_b@domain.com não entra pq ele tem a tem a tab_b mas não tem a tag_a.

 

Agora como fazer isso em uma query só?

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT 
`mails`.* 
FROM 
`email_tags` AS `mTags`
INNER JOIN 
	`emails` 
AS `mails` ON ( 
	`mails`.`mid` = `mTags`.`mid`
) 
INNER JOIN
	`tags` 
ON ( 
	`mTags`.`tagID` = `tags`.`tid`
)
WHERE 
`tags`.`tag` IN ( 'tag_a' , 'tag_b' ) 
GROUP BY 
`mails`.`mail` 
HAVING 
COUNT( DISTINCT `tags`.`tag` ) = 2 

 

:seta:

mysql> select * from emails ;
+-----+-------------------+
| mid | mail              |
+-----+-------------------+
|   1 | name_a@domain.com |
|   2 | name_b@domain.com |
|   3 | name_c@domain.com |
+-----+-------------------+
3 rows in set (0.00 sec)

mysql> select * from email_tags ;
+-------+-----+
| tagID | mid |
+-------+-----+
|     1 |   1 |
|     2 |   1 |
|     3 |   1 |
|     2 |   2 |
|     3 |   2 |
|     1 |   3 |
|     2 |   3 |
+-------+-----+
7 rows in set (0.00 sec)

mysql> select * from tags;
+-----+-------+
| tid | tag   |
+-----+-------+
|   1 | tag_a |
|   2 | tag_b |
|   3 | tag_c |
+-----+-------+
3 rows in set (0.00 sec)

mysql> select mails.* from email_tags as mTags inner join emails as mails on ( mails.mid = mTags.mid ) 
inner join tags on ( mTags.tagID = tags.tid ) where tags.tag in ( 'tag_a' , 'tag_b' ) group by mails.mail 
having count( distinct tags.tag ) = 2 ;
+-----+-------------------+
| mid | mail              |
+-----+-------------------+
|   1 | name_a@domain.com |
|   3 | name_c@domain.com |
+-----+-------------------+
2 rows in set (0.00 sec)

 

;)

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.