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 los productos que tengan la etiqueta 50, 1 y 32, y aquí está el tema, es 50 AND 1 AND 32, no es 50 OR 1 OR 32.
Para listar los productos de una sola o varias etiquetas con OR no hay problema, con un JOIN se resuelve:
Código:
El problema es al intentar filtrar por dos etiquetasSELECT * FROM productos JOIN productos_etiquetas ON productos_etiquetas.producto_id = producto.id WHERE productos_etiquetas.producto_id = 50 OR ...
Lo he resuelto pero intuyo que hay mejores soluciones.
Código:
Esto funciona. Básicamente lo que hace es filtrar por las etiquetas que me interesa y agrupar por el id del producto, entonces si COUNT es igual a la cantidad de etiquetas significa que cumple las 3 condiciones.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 ('50', '1', '32) GROUP BY productos_etiquetas.producto_id HAVING count = 3 ORDER BY productos.titulo ASC
No me gusta para nada esta solución, pero llegué hasta aquí despues de darle unas cuantas vueltas :S
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...