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

Entidades debiles obligatorias

Estas en el tema de Entidades debiles obligatorias en el foro de Mysql en Foros del Web. Hola gente tengo un problema de hace meses y ya es momento de resolver pero no puedo! la estructura es muy simple, tipico caso de ...
  #1 (permalink)  
Antiguo 07/07/2014, 22:20
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Entidades debiles obligatorias

Hola gente tengo un problema de hace meses y ya es momento de resolver pero no puedo!


la estructura es muy simple, tipico caso de 1 producto tiene N comodidades:


Productos
-------------
producto_id (PK)
producto_nombre

producto_comodidades
-----------------------------
prc_id (PK)
comodidades_id (FK)
producto_id (FK)

comodidades
----------------
comodidades_id (PK)
comodidades_nombre

luego tengo esta query que me trae todos los productos con las comodidades con (comodidades_id = 1 OR 6):

Código SQL:
Ver original
  1. SELECT  *
  2. FROM productos P
  3. INNER JOIN producto_comodidades PC ON ( PC.producto_id = P.producto_id )
  4. WHERE (PC.comodidades_id =2 OR PC.comodidades_id =6)

Esto esta bien, pero ahora lo que quiero hacer es que me traiga SOLO los productos con comodidades (comodidades_id = 1 AND 6)
Pero no me ningun resultado!
Código SQL:
Ver original
  1. SELECT  *
  2. FROM productos P
  3. INNER JOIN producto_comodidades PC ON ( PC.producto_id = P.producto_id )
  4. WHERE (PC.comodidades_id =2 AND PC.comodidades_id =6)

O sea que me traiga los productos solo si tiene ambas comodidades

gracias por su ayuda!
  #2 (permalink)  
Antiguo 08/07/2014, 02:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Entidades debiles obligatorias

Esta mal planteado, comodidades_id NO PEDE SER IGUAL a 2 Y a 6 al mismo tiempo (2 o 1 no se que estas buscando dices una cosa y pones otra)

Debes buscar los productos que estan en los dos conjuntos

Código MySQL:
Ver original
  1. SELECT  *
  2. FROM productos P
  3. INNER JOIN producto_comodidades PC ON PC.producto_id = P.producto_id
  4. WHERE PC.comodidades_id =2;

Código MySQL:
Ver original
  1. SELECT  *
  2. FROM productos P
  3. INNER JOIN producto_comodidades PC ON PC.producto_id = P.producto_id
  4. WHERE PC.comodidades_id =6;

Cita:
traiga SOLO los productos con comodidades (comodidades_id = 1 AND 6)
Código MySQL:
Ver original
  1.     FROM productos P
  2.             INNER JOIN producto_comodidades PC
  3.                   ON PC.producto_id = P.producto_id
  4.     WHERE P.producto_id IN (SELECT  PC.producto_id
  5.                                              FROM producto_comodidades PC
  6.                                              WHERE PC.comodidades_id =2)
  7.            AND P.producto_id IN (SELECT  PC.producto_id
  8.                                                FROM producto_comodidades PC
  9.                                                WHERE PC.comodidades_id =6);

Salvando claro la diferencia entre uno y dos

(Que son las "comodidades")
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 08/07/2014, 09:07
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Entidades debiles obligatorias

Excelente!
al final el query me quedo asi:

Código SQL:
Ver original
  1. SELECT DISTINCT (P.producto_id), P . *
  2. FROM productos P
  3. INNER JOIN producto_comodidades PC ON PC.producto_id = P.producto_id
  4. WHERE P.producto_id
  5. IN (
  6. SELECT PCa.producto_id
  7. FROM producto_comodidades PCa
  8. WHERE PCa.comodidades_id =2
  9. )
  10. AND P.producto_id
  11. IN (
  12. SELECT PCb.producto_id
  13. FROM producto_comodidades PCb
  14. WHERE PCb.comodidades_id =6
  15. )
  16. LIMIT 0 , 30

Etiquetas: entidades, join, select
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:12.