2016-10-19 2 views
1

Ich habe diese Tabelle:JOIN mehrere Tabellen mit Ergebnissen auf der gleichen Spalte

Table1

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

Für jede Kategorie, ich habe Tabellen mit Unterkategorien, und die entsprechende Kategorie-ID, wie folgt aus:

Table2

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

Table3

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

Ich möchte, dass meine Daten abzufragen, so dass ich die folgenden:

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

ich so etwas wie dies versucht, aber es stellt die Daten aus jeder Tabelle auf einer neuen Spalte.

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 

Ich bin ein Anfänger.

Vielen Dank!

+0

t1 links (t2 UNION ALL t3) beitreten – jarlh

+5

Dies ist eine schreckliche Design hat, warum pro Kategorie eine Tabelle statt nur eine Tabelle? – Lamak

+0

@Lamak hat Recht. Wenn Sie das Design der Datenbank ändern dürfen, tun Sie dies JETZT und legen Sie alle Unterkategorien nur in einer Tabelle ab. – Woozar

Antwort

1

Sie brauchen für jede Unterkategorie keine neue Tabelle. Wenn Sie das ändern, haben Sie nur zwei Tabellen und können sich ihnen einfach anschließen.

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

Wie ich aus Ihrer Frage las die Unterkategorien in verschiedenen Tabellen sind, so könnten Sie eine UNION (ALL) für diese Tabellen machen und dann zu Ihrer Tabelle 1 verbinden, wie diese Hoffnung

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 

dieses hilft Ihnen

0

Vorschlag: Erstellen Sie einige VIEW s, um sicherzustellen, dass Sie Datenelemente vernünftig und konsistent benannt haben, die die Abfrage einfacher zu schreiben, z. B. macht

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); 
Verwandte Themen