2016-10-19 2 views
1

У меня есть эта таблица:JOIN несколько таблиц с результатами на той же колонке

Table1

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

Для каждой категории, у меня есть таблицы с подразделами, и соответствующий идентификатор категории, например:

Table2

-------------------------------- 
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 Выравнивание по левому краю (t2 t3 UNION ALL) – 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 (ВЕСЬ) для этих таблиц, а затем присоединиться к вашим Table1, как этому

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); 
Смежные вопросы