redstyle 7 Denunciar post Postado Janeiro 12, 2012 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
Andrey Knupp Vital 136 Denunciar post Postado Janeiro 12, 2012 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
redstyle 7 Denunciar post Postado Janeiro 13, 2012 Valeu Andrey. Funcionou perfeitamente. Muito obrigado pela resposta. []'s Compartilhar este post Link para o post Compartilhar em outros sites