2012-08-27 43 views
11

tengo estas cuatro tablas:combinación interna con varias tablas

PRODUCTS 
--------- 
PRODUCT_ID 
PRODUCT_TITLE 
(other fields) 

COLORS 
--------- 
COLOR_ID 
COLOR_NAME 

MATERIALS 
--------- 
MATERIAL_ID 
MATERIAL_NAME 

IMAGES 
--------- 
IMAGE_ID 
BIG 
MED 
SMALL 
THUMB 

SIZE 
--------- 
SIZE_ID 
SIZE_NAME 

Y también:

PRODUCT_COLOR 
--------- 
PRODUCT_ID 
COLOR_ID 

PRODUCT_MATERIAL 
--------- 
PRODUCT_ID 
MATERIAL_ID 

PRODUCT_SIZE 
--------- 
PRODUCT_ID 
SIZE_ID 

PRODUCT_IMAGE 
--------- 
PRODUCT_ID 
IMAGE_ID 
COLOR_ID (can be null) 
MATERIAL_ID (can be null) 

Todos los productos pueden tener un color y/o material diferente. P.ej. Puedo tener un producto que tenga una o más opciones de material pero sin colores asociados y viceversa. La salida debe ser algo como esto:

----------------------------------------------------------------------------- 
| PRODUCT_ID | PRODUCT_NAME | COLOR_ID | MATERIAL_ID | IMAGE_ID | SIZE_ID | 
----------------------------------------------------------------------------- 
| 1   | T-SHIRT  | 1  | null  | 1  | 1  | 
| 1   | T-SHIRT  | 1  | null  | 1  | 2  | 
| 1   | T-SHIRT  | 1  | null  | 1  | 3  | 
| 1   | T-SHIRT  | 1  | null  | 1  | 4  | 
| 2   | JEANS   | null  | 1   | 2  | 1  | 
| 2   | JEANS   | null  | 1   | 2  | 2  | 
| 2   | JEANS   | null  | 1   | 2  | 3  | 
| 2   | JEANS   | null  | 1   | 2  | 4  | 
| 2   | JEANS   | null  | 1   | 2  | 5  | 
| 3   | T-SHIRT VNECK | 2  | 2   | 3  | 1  | 
| 3   | T-SHIRT VNECK | 2  | 2   | 3  | 2  | 
| 3   | T-SHIRT VNECK | 3  | 2   | 4  | 1  | 
| 3   | T-SHIRT VNECK | 3  | 2   | 4  | 2  | 
| 3   | T-SHIRT VNECK | 4  | 3   | 5  | 1  | 
| 3   | T-SHIRT VNECK | 4  | 3   | 5  | 2  | 
----------------------------------------------------------------------------- 

He intentado el siguiente comunicado pero devuelve 0 filas:

SELECT PRODUCTS.PRODUCT_ID, PRODUCTS.PRODUCT_TITLE, COLORS.COLOR_ID, MATERIALS.MATERIAL_ID, IMAGES.IMAGE_ID, SIZE.SIZE_ID from PRODUCTS 
    INNER JOIN PRODUCT_COLOR ON (PRODUCTS.PRODUCT_ID = PRODUCT_COLOR.PRODUCT_ID) 
    INNER JOIN COLORS ON (COLORS.COLOR_ID = PRODUCT_COLOR.COLOR_ID) 
    INNER JOIN PRODUCT_MATERIAL ON (PRODUCTS.PRODUCT_ID = PRODUCT_MATERIAL.PRODUCT_ID) 
    INNER JOIN MATERIALS ON (MATERIALS.MATERIAL_ID = PRODUCT_MATERIAL.MATERIAL_ID) 
    INNER JOIN PRODUCT_IMAGE ON (PRODUCTS.PRODUCT_ID = PRODUCT_IMAGE.PRODUCT_ID) 
    INNER JOIN IMAGES ON (IMAGES.IMAGE_ID = PRODUCT_IMAGE.IMAGE_ID) 
    INNER JOIN PRODUCT_SIZE ON (PRODUCTS.PRODUCT_ID = PRODUCT_SIZE.PRODUCT_ID) 
    INNER JOIN SIZE ON (SIZE.SIZE_ID = PRODUCT_SIZE.SIZE_ID) 
    ORDER BY PRODUCTS.id_PRODUCT; 

alguna idea?

Respuesta

19

se podría hacer algo como esto:

select p.product_id, 
    p.product_name, 
    c.color_id, 
    m.material_id, 
    i.image_id, 
    s.size_id 
from products p 
left join product_color pc 
    on p.product_id = pc.product_id 
left join colors c 
    on pc.color_id = c.colorid 
left join product_material pm 
    on p.product_id = pm.product_id 
left join materials m 
    on pm.material_id = m.material_id 
left join product_image pi 
    on p.product_id = pi.product_id 
left join images i 
    on pi.image_id = i.image_id 
    or c.color_id = i.color_id 
    or m.material_id = i.material_id 
left join product_size ps 
    on p.product_id = ps.product_id 
left join size s 
    on ps.size_id = s.size_id 

Te aconsejaría que revisar JOIN s. Hay un gran visual explanation of joins en línea que lo ayudará a escribir estas consultas.

+0

@Sprite creo que es necesario usar 'IZQUIERDA JOIN' en lugar de' INTERIOR JOIN' – Taryn

+0

Sí. El enlace que me diste me ayudó mucho. – Samuel

+0

perfecto !!!! gracias –

2

Bueno, tienes que aprender a construir combinaciones, y la forma en que normalmente lo hago es seleccionando una tabla y unir la siguiente y la siguiente y la siguiente hasta que tenga el resultado que quiero.

select product_id, product_name 
    from products 

siguiente me unen el primero que necesito para seguir adelante y decir

select p.product_id, p.product_name, pc.color_id 
    from products p 
    join product_color pc on (pc.product_id = p.product_id) 

en la unión es importante averiguar si tal vez no tengo nada para unirse con y todavía quiero mira la linea Por lo tanto, prefiero usar una combinación de la izquierda

 select p.product_id, p.product_name, pc.color_id 
     from products p 
    left join product_color pc on (pc.product_id = p.product_id) 

De esta forma, agrega cada tabla para unir. Por cierto. ¿Es esta tarea?

+0

No es tarea, estoy ejecutando un estudio de caso para filtrar estos productos. – Samuel

+0

Bien. Parece que sí. Entonces, ¿mi o una de las respuestas te ayudaron a construir la consulta? Para mí, parecía una pregunta muy básica o tal vez me perdí un punto. – hol

+0

Para ser sincero, no escribí ninguna línea de SQL desde la universidad ... Y las clases de DB eran muy pobres. Solo necesitaba estas tablas para ejecutar mi prototipo y estudiar las opciones de filtro. – Samuel

0

Si sólo necesita identificaciones, que sea sencillo

select p.product_id, 
    p.product_name, 
    pc.color_id, 
    pm.material_id, 
    pi.image_id, 
    ps.size_id 
from products p, 
PRODUCT_COLOR pc, 
product_material pm, 
PRODUCT_SIZE ps, 
PRODUCT_IMAGE pi 
where 
p.product_id = pc.product_id(+) 
and p.product_id = pm.product_id(+) 
and p.product_id = ps.product_id(+) 
and p.product_id = pi.product_id(+); 
+0

El OP especifica que 'COLOR_ID' y' MATERIAL_ID' pueden ser nulos. – Kermit

+0

oops se olvidó de eso ... Hizo una modificación para que fuera una combinación externa – Kamal

Cuestiones relacionadas