Creo que el título no ayuda mucho a entender mi pregunta :S
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:
SELECT *
FROM productos
JOIN productos_etiquetas ON productos_etiquetas.producto_id = producto.id
WHERE productos_etiquetas.producto_id = 50
OR ...
El problema es al intentar filtrar por dos etiquetas
Lo he resuelto pero intuyo que hay mejores soluciones.
Código:
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
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.
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...