2016-08-17 49 views
0

我有4個表:來選擇並加入這些表的最有效方法

表1(組):

id_group name_group 
1   abc 
2   def 
3   ghi 

表2(彩色):

id_color name_color 
1   blue 
2   red 
3   green 

表3(綜藝): (調):

id_tone id_color id_group name_tone 
1   1  1  ocean 
2   5  1  sea 
3   9  3  clay 

鑑於像1的id_group我要做出選擇導致這樣的事情:

id_group id_color name_variety name_tone 
1  1  light  ocean 
1  3  dark   NULL 
1  5  NULL   sea 

我能夠與聯盟來解決問題和改變的順序JOINS但我認爲必須有另一種解決方案

SELECT 
    GRO.id_group, COL.id_color, VARI.name_variety, TONE.name_tone 
FROM 
    groups GRO 
LEFT OUTER JOIN 
    variety VARI ON (VARI.id_group = GRO.id_group) 
LEFT OUTER JOIN 
    tone TONE ON (TONE.id_group = GRO.id_group) 
       AND (TONE.id_color = VARI.id_color) 
LEFT OUTER JOIN 
    color COL ON (COL.id_color = VARI.id_color) 
       OR (COL.id_color = TONE.id_color) 
WHERE 
    GRO.id_group = 1 

UNION 

SELECT 
    GRO.id_group, COL.id_color, VARI.name_variety, TONE.name_tone 
FROM 
    groups GRO 
LEFT OUTER JOIN 
    tone TONE ON (TONE.id_group = GRO.id_group) 
LEFT OUTER JOIN 
    variety VARI ON (VARI.id_group = GRO.id_group) 
       AND (VARI .id_color = TONE.id_color) 
LEFT OUTER JOIN 
    color COL ON (COL.id_color = VARI.id_color) 
       OR (COL.id_color = TONE.id_color) 
WHERE 
    GRO.id_group = 1 
+0

你說的是你有三個表,但我看到的組是第四個表。所以你有三張或四張桌子? –

+0

你說得對,我有三個以上的表格,但我猜想沒有必要顯示組的表格內容。我會編輯,謝謝! – Straty

回答

0

我想你想要的是更多的東西一樣:

SELECT 
    id_group, 
    id_color, 
    MAX(max_variety), 
    MAX(max_tone) 
FROM 
    (SELECT 
     v.id_group, 
     v.id_color, 
     MAX(name_variety) AS max_variety, 
     MAX(name_tone) AS max_tone 
    FROM 
     variety V INNER JOIN 
     color c ON 
     V.id_color = c.id_color LEFT OUTER JOIN 
     tone t ON 
     t.id_group = v.id_group AND 
     t.id_color = V.id_color 
    WHERE 
     v.id_group = 1 
    GROUP BY 
     v.id_group, 
     v.id_color 

    UNION ALL 

    SELECT 
     t.id_group, 
     t.id_color, 
     MAX(name_variety) AS max_variety, 
     MAX(name_tone) AS max_tone 
    FROM 
     tone t INNER JOIN 
     color c ON 
     t.id_color = c.id_color LEFT OUTER JOIN 
     variety V ON 
     v.id_group = t.id_group AND 
     v.id_color = t.id_color 
    WHERE 
     t.id_group = 1 
    GROUP BY 
     t.id_group, 
     t.id_color) u 
GROUP BY 
    id_group, 
    id_color 
0

而不是使用聯合可以使用完全聯接,因爲完全聯接返回第一個表的所有結果以及第二個表的所有結果。

SELECT GRO.id_group,COL.id_color,VARI.name_variety,Tone.name_tone從品種VARI 上col.id_color聯接顏色COL = VARI col.id 上GRO.id_group = VARI.id_group 加入羣組GRO Tone.id_group = GRO.id_group 其中GRO.id_group = 1

+0

嗨,該代碼將返回更多的行重複** id_color 1 **,並沒有顯示** id_color 5 **它應該是id_color 1,3,5,如我的例子。不管怎麼說,還是要謝謝你! ^^ – Straty

相關問題