2016-10-19 99 views
1

我有這樣的表:JOIN多個表與在同一列上的結果

表1

-------------------- 
id | category 
-------------------- 
1 | Cat1 
2 | Cat2 
3 | Cat3 

對於每個類別,我與子類別的表,和對應的類別ID,如下所示:

表2

-------------------------------- 
id | subcategory | category_id 
-------------------------------- 
1 | subcat1  |  1 
2 | subcat2  |  1 
3 | subcat3  |  1 
4 | subcat4  |  1 

表3

-------------------------------- 
id | subcategory | category_id 
-------------------------------- 
1 | subcat5  |  2 
2 | subcat6  |  2 
3 | subcat7  |  2 
4 | subcat8  |  2 

我想查詢我的數據,所以我得到如下:

----------------------------------------------------- 
category | subcategory (from Table2 and Table3) 
----------------------------------------------------- 
Cat1  | subcat1  
Cat1  | subcat2  
Cat1  | subcat3  
Cat1  | subcat4 
Cat2  | subcat5  
Cat2  | subcat6  
Cat2  | subcat7  
Cat2  | subcat8 
Cat3  | NULL 

我想這樣的事情,但它把數據從每個表上的一個新列。

SELECT Table1.category, Table2.subcategory , Table3.subcategory 
FROM Table1 
LEFT JOIN Table2 ON Table1.id=Table2 .category_id 
LEFT JOIN Table3 ON Table1.id=Table3.category_id 

我是初學者。

謝謝!

+0

T1 LEFT JOIN(T2 UNION ALL T3) – jarlh

+5

這是一個可怕的設計,爲什麼每個類別,而不僅僅是一個表一個表? – Lamak

+0

@拉馬克是對的。如果您可以更改數據庫設計,請立即執行,並將所有子類別僅放入1個表格中。 – Woozar

回答

1

您不需要每個子類別的新表格。如果你改變了你只有兩張桌子,並且可以加入他們。

1
SELECT c.Category,s.SubCategory 
    FROM Table1 c 
LEFT JOIN 
     (
     SELECT * FROM Table2 
     UNION ALL 
     SELECT * FROM Table3 
     ) s 
    ON c.id = s.id; 
1

當我從你的問題看的子類別在不同的表,那麼你可以做一個UNION(ALL)爲這些表,然後加入到你的表1,像這樣

SELECT Table1.category, Table2.subcategory, Table3.subcategory 
FROM Table1 
LEFT JOIN (SELECT Table2.category_id, Table2.subcategory 
      FROM Table2 
      UNION ALL 
      SELECT Table3.category_id, Table3.subcategory 
      FROM Table3 
     ) sub 
ON Table1.id=sub.category_id 

希望這幫助你

0

建議:創建一些VIEW s,以確保你有合理而一致的數據項,這將使查詢更易於編寫例如

CREATE VIEW Subcategories 
AS 
SELECT subcategory, category_id 
    FROM Table2 
UNION 
SELECT subcategory, category_id 
    FROM Table3; 


CREATE VIEW Categories 
AS 
SELECT id AS category_id, category 
    FROM Table1; 


SELECT category, subcategory 
    FROM Categories NATURAL JOIN Subcategories 
UNION 
SELECT category, 0 AS subcategory 
    FROM Categories 
WHERE category_id NOT IN (SELECT category_id 
           FROM Subcategories); 
相關問題