Сгруппировать таблицу дважды – на двух разных столбцах одной таблицы

У меня очень запутанная база данных с таблицей, которая содержит два значения, которые мне нужны в отдельной таблице. Вот моя проблема:

Table1 - id Table2 - id - table1_id - table3_id_1 - table3_id_2 Table3 - id - value 

Мне нужно перейти из таблицы 1 и сделать соединение, которое вернет мне значение из table3 в двух отдельных столбцах. Поэтому я хочу что-то вроде этого:

 table1.id | table2.id | table2.table3_id_1 | table2.table3_id_2 | X | Y 

Где X и Y – значения для строки, связанной table3_id_1 и table3_id_2 соответственно.

Возможно, сделайте их переменными или чем-то, чтобы я мог также фильтровать их в предложении WHERE ?

 SELECT t2.table1_id , t2.id AS table2_id , t2.table3_id_1 , t2.table3_id_2 , t31.value AS x , t32.value AS y FROM table2 t2 LEFT JOIN table3 t31 ON t31.id = t2.table3_id_1 LEFT JOIN table3 t32 ON t32.id = t2.table3_id_2; 

Нет необходимости вступать в table1 . table2 имеет все, что вам нужно – при условии наличия ограничения внешнего ключа, гарантирующего ссылочную целостность (все t2.table1_id действительно присутствуют в table1 ). Кроме того, вы можете присоединиться к table1 , тем самым выбрав только строки, присутствующие в table1 .

Я использую LEFT [OUTER] JOIN (а не [INNER] JOIN ), чтобы присоединиться к обоим экземплярам table3 по той же причине: неясно, гарантирована ли ссылочная целостность – и может ли любой из столбцов ключа быть NULL. [INNER] JOIN удаляет строки из результата, где совпадение не найдено. Я предполагаю, что вы предпочитаете отображать такие строки со значением NULL для любых отсутствующих x или y .

И table3.id должен быть UNIQUE , или мы могли бы умножать строки с несколькими совпадениями от каждого LEFT JOIN :

  • Два SQL LEFT JOINS производят неверный результат

Если вы несколько раз присоединяетесь к таблице, используйте псевдонимы, чтобы отличить их:

 SELECT table1.id,table2.id,table2.table3_id_1,table2.table3_id_2,t3_1.id,t3_2.id FROM table1 JOIN table2 ON table1.id=table2.table1_id JOIN table3 t3_1 ON table2.table3_id_1=t3_1.id JOIN table3 t3_2 ON table2.table3_id_2=t3_2.id WHERE ... t3_1.id=... AND ... t3_2.id=... 
 select t1.id as table1_id, t2.id as table2_id, t2.table3_id_1, t2.table3_id_2, t3_1.value as X, t3_2.value as Y from Table1 t1 inner join Table2 t2 on t1.id = t2.table1_id inner join Table3 t3_1 on t2.table3_id_1 = t3_1.id inner join Table3 t3_2 on t2.table3_id_2 = t3_2.id where t3_1.value = 'some_value' or t3_2.value = 'some_other_value'