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

Selecione todos os projetos que tenham tags correspondentes


Em qualquer um dos seguintes casos, se você não conhece o PROJECT.num /PROJECT_TO_TAGS.project_id , você terá que participar dos PROJECTS table para obter o valor do id para descobrir quais tags ele associou.

Usando IN

SELECT p.*
  FROM PROJECTS p
  JOIN PROJECTS_TO_TAGS pt ON pt.project_id = p.num
 WHERE pt.tag_id IN (SELECT x.tag_id
                       FROM PROJECTS_TO_TAGS x
                      WHERE x.project_id = 4)

Usando EXISTS

SELECT p.*
  FROM PROJECTS p
  JOIN PROJECTS_TO_TAGS pt ON pt.project_id = p.num
 WHERE EXISTS (SELECT NULL
                 FROM PROJECTS_TO_TAGS x
                WHERE x.project_id = 4
                  AND x.tag_id = pt.tag_id)

Usando JOINS (este é o mais eficiente!)


O DISTINCT é necessário porque JOINs arriscam dados duplicados aparecendo no conjunto de resultados ...
SELECT DISTINCT p.*
  FROM PROJECTS p
  JOIN PROJECTS_TO_TAGS pt ON pt.project_id = p.num
  JOIN PROJECTS_TO_TAGS x ON x.tag_id = pt.tag_id
                         AND x.project_id = 4