2012-08-27 14 views
11

Ho questi quattro tavoli:INNER JOIN con più tabelle

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 

E inoltre:

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) 

Tutti i prodotti possono avere un colore e/o di materiale diverso. Per esempio. Posso avere un prodotto che abbia una o più opzioni materiali ma nessun colore associato e viceversa. L'output dovrebbe essere qualcosa di simile:

----------------------------------------------------------------------------- 
| 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  | 
----------------------------------------------------------------------------- 

Ho provato la seguente dichiarazione, ma restituisce 0 righe:

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; 

Tutte le idee?

risposta

19

Si potrebbe fare qualcosa di simile:

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 

vi consiglio di rivedere JOIN s. C'è un ottimo visual explanation of joins online che ti aiuterà a scrivere queste domande.

+0

@Sprite Penso che avete bisogno di usare 'SINISTRA JOIN' invece di' INTERNO JOIN' – Taryn

+0

Sì. Il collegamento che mi hai dato mi ha aiutato molto. – Samuel

+0

perfetto !!!! grazie –

2

Bene, è necessario imparare come creare join e il modo in cui normalmente lo faccio è selezionare una tabella e unire la successiva e la successiva alla successiva finché non avrò il risultato che voglio.

select product_id, product_name 
    from products 

prossima Mi unisco al primo che ho bisogno quindi vado avanti e dico

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

Sulla aderire è importante capire se io forse ho nulla da unire con e ho ancora voglia di vedere la linea. Così ho piuttosto uso un left join

 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) 

In questo modo si aggiunge ogni tabella di aderire. A proposito. Sono questi compiti?

+0

Non a casa, sto facendo un case study per filtrare questi prodotti. – Samuel

+0

Bene. Sembrava così. Quindi, la mia o una delle risposte ti aiuta a costruire la query? Per me sembrava una domanda molto semplice o forse ho perso un punto? – hol

+0

Ad essere onesti non ho scritto nessuna riga di sql dal college ... E le classi di db erano molto povere. Avevo bisogno solo di queste tabelle per far funzionare il mio prototipo e studiare le opzioni del filtro. – Samuel

0

Se avete solo bisogno gli ID, mantenere le cose semplici

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

L'OP specifica che 'COLOR_ID' e' MATERIAL_ID' possono essere nulli. – Kermit

+0

oops lo hanno perso .. Apportato una modifica per renderlo più esterno – Kamal