Сгруппировать таблицу дважды - на двух разных столбцах одной таблицы
У меня очень запутанная база данных с таблицей, которая содержит два значения, которые мне нужны в отдельной таблице. Вот моя проблема:
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
?
Ответы
Ответ 1
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
:
Ответ 2
Если вы несколько раз присоединяетесь к таблице, используйте псевдонимы, чтобы отличить их:
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=...
Ответ 3
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'