Filtrado de la tabla de unión

Estoy teniendo problemas con una complicada consulta SQL.

En mi database MySQL están las tablas topics, tags y tags_topics para unirlas. Quiero search temas que comparten las mismas tags especificadas. Por ejemplo, supongamos que tengo 3 tags con identificadores 1, 2 y 3, quiero search todos los temas que tienen las tags 1, 2 y 3 asociadas a ellos. Los temas pueden tener otras tags, pero deben tener todas las tags especificadas.

Ayúdame a pensar por favor xD

EDITAR: Encontré una solución usando GROUP BY en esta pregunta: Obteniendo solo filas que coinciden con todas las inputs en una tabla unida (SQL) Si alguien tiene una solución más elegante, por favor publique 🙂

JOIN solución:

 SELECT t.* FROM topics t JOIN tags_topics t1 ON (t.id = t1.topicId AND t1.tagId = 1) JOIN tags_topics t2 ON (t.id = t2.topicId AND t2.tagId = 2) JOIN tags_topics t3 ON (t.id = t3.topicId AND t3.tagId = 3) 

Solución GROUP BY :

Tenga en count que debe listr todas las columnas t.* En la cláusula GROUP BY , a less que use MySQL o SQLite.

 SELECT t.* FROM topics t JOIN tags_topics tt ON (t.id = tt.topicId AND tt.tagId IN (1,2,3)) GROUP BY t.id, ... HAVING COUNT(*) = 3; 

Solución de subconsulta:

 SELECT t.* FROM topics t WHERE t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 1) AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 2) AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 3); 

Solución modificada de GROUP BY :

Simplifica la cláusula GROUP BY al aislar la búsqueda en una subconsulta.

 SELECT t.* FROM topics t WHERE t.id IN ( SELECT tt.topicId FROM tags_topics tt WHERE tt.tagId IN (1,2,3)) GROUP BY tt.id HAVING COUNT(*) = 3 ); 
 SELECT topic_id FROM tags_topics WHERE tag_id IN (1,2,3) GROUP BY topic_id HAVING COUNT(*) > 2 /* or use COUNT(*) = 3 if you know that there cannot be duplicates in the junction table */