Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Selecione onde em muitos para muitos


Supondo que você queira mais do que apenas o id do artigo:
SELECT a.id
      ,a.other_stuff
  FROM articles a
  JOIN article_category ac
    ON ac.article_id = a.id
GROUP BY a.id
HAVING GROUP_CONCAT(DISTINCT ac.category_id ORDER BY ac.category_id SEPARATOR ',') = '1,2'

Se tudo o que você quer é o id do artigo, tente isto:
SELECT article_id
  FROM article_category 
GROUP BY article_id
HAVING GROUP_CONCAT(DISTINCT category_id ORDER BY category_id SEPARATOR ',') = '1,2'

Veja-o em ação em http://sqlfiddle.com/#!2/9d213/4

Deve-se acrescentar também que a vantagem desta abordagem é que ela pode suportar a verificação de qualquer número de categorias sem ter que alterar a consulta. Basta tornar '1,2' uma variável de string e alterar o que é passado para a consulta. Assim, você pode facilmente pesquisar artigos com categorias 1, 2 e 7 passando uma string de '1,2,7'. Não são necessárias junções adicionais.