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

Consulta con IN devuelve parámetros no deseados

Estas en el tema de Consulta con IN devuelve parámetros no deseados en el foro de Mysql en Foros del Web. Hola a todo el mundo, tengo una consulta que filtra caraterísticas de productos por una tabla relacional. Sería algo así: Código PHP: Tabla productos : idproducto  ...
  #1 (permalink)  
Antiguo 31/10/2011, 06:29
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Consulta con IN devuelve parámetros no deseados

Hola a todo el mundo,
tengo una consulta que filtra caraterísticas de productos por una tabla relacional.

Sería algo así:

Código PHP:
Tabla productos:
idproducto -> autoincrement
nombre 
-> char

Tabla caracteristicas
:
idcarac -> autoincrement
nombre 
-> char

Tabla relacional producos
-características
idproducto 
-> int
idcarac 
-> int 
En la tabla relacional se van relacionando productos con características, y luego el filtro de productos lo extraigo con la consulta IN, así:

Código PHP:
Select p.nombre From productos p Where p.idproducto IN 
(Select idproducto From caracteristicas_rel Where idcarac IN (4,7,8
and 
idproducto=p.idproducto); 
Esto me devuelve un buen resultado, el problema es el siguiente.

Si yo tengo dos productos, imaginemos dos discos duros:

- Disco duro 1
- Características 500Gb

- Disco duro 2
- Características 600Gb

Y en la web marco 500Gb como característica, me extraerá el disco 1, pero si marco 500Gb y 600Gb entonces me extrae el disco 1 y 2, cuando no debería de extraer ninguno, ¿entienden?

Ya que al seleccionar la dos características estos dos productos NO cumplen con el criterio, es decir, o son de 500 o 600gb

¿Cómo puedo hacer la consulta para que fuerce a sacar sólo los productos que tengan TODAS las características marcadas.

Haciendo un Inner Join no me vale, más que nada porque tengo muchas tablas relacionadas más.

Gracias a todo el mundo!
  #2 (permalink)  
Antiguo 31/10/2011, 08:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta con IN devuelve parámetros no deseados

Cita:
Y en la web marco 500Gb como característica, me extraerá el disco 1, pero si marco 500Gb y 600Gb entonces me extrae el disco 1 y 2, cuando no debería de extraer ninguno, ¿entienden?
Error. IN() funciona como un OR múltiple, por lo que basta que se cumpla con uno de los dos para que sea verdadero.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/11/2011, 02:53
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Respuesta: Consulta con IN devuelve parámetros no deseados

Gracias por responder,
pero lo que yo quiero es que se tengan que cumplir los dos para que aparezca un resultado.

¿Eso es posible?

Gracias.
  #4 (permalink)  
Antiguo 02/11/2011, 03:05
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta con IN devuelve parámetros no deseados

Con el IN no. Si el numero de caracteristicas a cumplir es variable puede ser complicado...

Se me ocurre esto pero seguro que hay más y mejores soluciones

Código MySQL:
Ver original
  1. Select p.nombre
  2. From productos p
  3.    p.idproducto
  4.        IN (Select idproducto
  5.                  FROM
  6.                     (Select idproducto
  7.                         From caracteristicas_rel
  8.                         Where idcarac=4) carac1
  9.                  INNER JOIN
  10.                     (Select idproducto
  11.                          From caracteristicas_rel
  12.                          Where idcarac=7) carac2
  13.                   ON carac1.idproducto=carac2.idproducto);

Esto te da solo los productos que cumplen la caracteristica 4 y la 7, en realidad es la interseccion de los dos conjuntos...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 02/11/2011 a las 03:28
  #5 (permalink)  
Antiguo 02/11/2011, 04:31
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Respuesta: Consulta con IN devuelve parámetros no deseados

Tiene buena pinta, lo único que me indica el error:

Column 'idproducto' in field list is ambiguous

A ver si podemos averiguar porque...
  #6 (permalink)  
Antiguo 02/11/2011, 05:33
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Respuesta: Consulta con IN devuelve parámetros no deseados

Al final lo eh conseguido con Inner joins encadenados.

Gracias por la ayuda! me ha dado una idea de lo que necesitaba!!
  #7 (permalink)  
Antiguo 02/11/2011, 05:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta con IN devuelve parámetros no deseados

Cita:
Iniciado por pempas Ver Mensaje
Tiene buena pinta, lo único que me indica el error:

Column 'idproducto' in field list is ambiguous

A ver si podemos averiguar porque...
Porque si tienes dos tablas en un INEER JOIN con el mismo nombre en algún campo, debes indicar bien cuál es la tabla de donde lo debe tomar.
En este caso, la subconsulta debe indicar si ese campo lo toma de la tabla derivada carac1 o de la carac2.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: devuelve, join, select, tabla
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 00:26.