Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[RESUELTO] Filtrar una tabla con otra usando dos condiciones

Estas en el tema de [RESUELTO] Filtrar una tabla con otra usando dos condiciones en el foro de SQL Server en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/10/2009, 09:01
 
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
  #2 (permalink)  
Antiguo 12/10/2009, 09:42
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Filtrar una tabla con otra usando dos condiciones

Cambia esta linea:

productos_etiquetas.etiqueta_id IN ('30', '31', '32)

Por:

productos_etiquetas.etiqueta_id IN >= '30' and productos_etiquetas.etiqueta_id IN <= '32'

De ser char, utiliza between.
  #3 (permalink)  
Antiguo 12/10/2009, 09:55
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: Filtrar una tabla con otra usando dos condiciones

Perdón, he modificado el ejemplo para que no queden dudas de mi problema :)

Las etiquetas pueden ser cualquier ID (gracias por responder)
__________________
Retro Invaders : Mi blog
  #4 (permalink)  
Antiguo 12/10/2009, 19:11
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Respuesta: Filtrar una tabla con otra usando dos condiciones

Me agrada tu problema.
Sin embargo, lo que me interesa saber, para tener una mejor idea es ¿cómo pasas a la consulta la lista de Id's a consultar? ¿es esto un procedimiento almacenado?
Según comprendo, quieres que devuelva un resultado siempre que para todos y cada uno de los Id's buscados en la inner table exista por lo menos un registro en la outer table. ¿me equivoco?
  #5 (permalink)  
Antiguo 13/10/2009, 05:58
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: Filtrar una tabla con otra usando dos condiciones

He publicado la pregunta también en el foro de Cristalab, donde me han propuesto que use las subconsultas, una solución que me gustó, yo nunca había usado estas subconsultas :)

Copio aquí para que sea útil al próximo con la misma duda.

Código HTML:
SELECT p.id, p.titulo
FROM productos p 
WHERE  
	(SELECT pe.etiqueta_id FROM productos_etiquetas pe WHERE pe.etiqueta_id = 50 AND pe.producto_id=p.id) 
	AND 
	(SELECT pe.etiqueta_id FROM productos_etiquetas pe WHERE pe.etiqueta_id = 1 AND pe.producto_id=p.id)
       AND 
	(SELECT pe.etiqueta_id FROM productos_etiquetas pe WHERE pe.etiqueta_id = 32 AND pe.producto_id=p.id)

Beakdan, gracias por el interés, los IDs a filtrar serían como un array, aunque obviamente eso depende del caso, ya que viendo la solución de usar subconsultas, tendría que procesar el array con PHP para crear esas subconsultas.
A ver si este último código resuelve tu duda :)
__________________
Retro Invaders : Mi blog
  #6 (permalink)  
Antiguo 13/10/2009, 08:51
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: [RESUELTO] Filtrar una tabla con otra usando dos condiciones

Para su conocimiento, la edicion 2008, ya recibe parametros de tipo TABLE, por tanto, podrias enviar una serie de REGISTROS y hacer tu consulta mas amigable.
  #7 (permalink)  
Antiguo 13/10/2009, 09:21
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: [RESUELTO] Filtrar una tabla con otra usando dos condiciones

iislas: ¿podrías explicar un poco más?
__________________
Retro Invaders : Mi blog
  #8 (permalink)  
Antiguo 13/10/2009, 10:16
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Respuesta: [RESUELTO] Filtrar una tabla con otra usando dos condiciones

La última consulta que has publicado ¿funciona realmente? A simple vista, me parece que tiene errores de lógica, ya que ¿cómo puede ser un producto.id dado ser igual a tres productos_etiquetas.producto_id diferentes?
Por otra parte, iislas hace notar un punto importante. Deberías indicar que versión de SQL Server estás usando para poder dar una respuesta adecuada. Ya que aunque es posible dar una sólución genérica, el mejor comportamiento / rendimiento lo obtendrás usando las opciones específicas de cada versión.

Saludos.
  #9 (permalink)  
Antiguo 13/10/2009, 10:28
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: [RESUELTO] Filtrar una tabla con otra usando dos condiciones

Beakdan: sí, esa última consulta funciona perfectamente. Lo que se pregunta por 3 cosas distintas es productos_etiquetas.etiqueta_id, no producto.id :)

Sobre lo que estoy usando, es MySQL, el que viene con XAMPP y demás.
__________________
Retro Invaders : Mi blog
  #10 (permalink)  
Antiguo 13/10/2009, 10:58
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: [RESUELTO] Filtrar una tabla con otra usando dos condiciones

¿MySQL?, ¿Que es eso?, jajajaja, no es broma.

Estas en un foro de SQL SERVER de Microsoft, ¿ya no habias notado?
  #11 (permalink)  
Antiguo 13/10/2009, 11:03
 
Fecha de Ingreso: febrero-2004
Ubicación: Carthagena
Mensajes: 205
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: [RESUELTO] Filtrar una tabla con otra usando dos condiciones

¡Coño! :D No me había dado cuenta :D :D

Igual, la solución me funcionó!

** A ver si algún moderador mueve esto al MySQL :P
__________________
Retro Invaders : Mi blog
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:31.