Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/10/2009, 09:01
josepzin
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
[RESUELTO] Filtrar una tabla con otra usando dos condiciones

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...
__________________
Retro Invaders : Mi blog

Última edición por josepzin; 13/10/2009 a las 05:59 Razón: Resuelto