El tema es así:
Tengo una tabla con PRODUCTOS, otra con ETIQUETAS y una intermedia PRODUCTOS_ETIQUETAS donde se almacenan la relacion entre cada producto y sus etiquetas, algo así:
PRODUCTOS: id, titulo
ETIQUETAS: id, nombre
PRODUCTOS_ETIQUETAS : producto_id, etiqueta_id
Bien, lo que yo quiero hacer es un listado de productos relacionado a varias etiquetas. Para listar los productos de una sola etiqueta no hay problema, con un JOIN se resuelve:
Código MySQL :
SELECT * FROM productos JOIN productos_etiquetas ON productos_etiquetas.producto_id = producto.id WHERE productos_etiquetas.producto_id = 30
"30" sería el id de la etiqueta que me interesa filtrar
El problema es al intentar filtrar por dos etiquetas, supongamos que quiero listar los productos que tengan las etiquetas 30 y 2
Lo he resuelto pero intuyo que hay mejores soluciones.
Código MySQL :
SELECT productos.id, productos.titulo, COUNT(*) AS count FROM (productos_etiquetas) JOIN productos ON productos_etiquetas.producto_id=productos.id WHERE condicionxxx = xxx AND productos_etiquetas.etiqueta_id IN ('30', '2') GROUP BY productos_etiquetas.producto_id HAVING count > 1 ORDER BY productos.titulo ASC LIMIT 3
Esto funciona. Básicamente lo que hace es filtrar por las etiquetas que me interesa y agrupar por el id del producto, entonces si hay mas de 1 significa que tiene las 2 etiquetas.
No me gusta para nada esta solución, pero llegué hasta aquí despues de darle unas cuantas vueltas
Además tiene el problema que si quiero contar la cantidad de resultados no puedo, porque el COUNT me indica según el GROUP... asi que menos todavía.
¿Hay alguna otra manera de hacer esto? Quizás haya una manera "mágica" y tonta que se me está pasando...