У меня есть простая иерархия component
в MySQL, которая описывается таблицей assembly
.
SELECT * FROM component;
+----+--------+------+
¦ id ¦ name ¦ type ¦
+----+--------+------+
¦ 11 ¦ car1 ¦ A ¦
¦ 12 ¦ car2 ¦ A ¦
¦ 13 ¦ car3 ¦ A ¦
¦ 21 ¦ motor1 ¦ B ¦
¦ 22 ¦ motor2 ¦ B ¦
¦ 31 ¦ brake1 ¦ C ¦
+----+--------+------+
SELECT * FROM assembly;
+----+-----------+----------+
¦ id ¦ parent_id ¦ child_id ¦
+----+-----------+----------+
¦ 1 ¦ 11 ¦ 21 ¦
¦ 2 ¦ 12 ¦ 22 ¦
¦ 3 ¦ 11 ¦ 31 ¦
¦ 4 ¦ 13 ¦ 31 ¦
+----+-----------+----------+
РЕДАКТИРОВАТЬ: Как правильно догадался Демс, третья запись (id = 3) отсутствовала в исходном сообщении. Таблица теперь заполнена.
Я хочу сгенерировать список всех автомобилей с названием его мотора, если таковые имеются. Каждый автомобиль должен появиться один раз.
Желаемый вывод:
+----------+------------+
¦ car_name ¦ motor_name ¦
+----------+------------+
¦ car1 ¦ motor1 ¦
¦ car2 ¦ motor2 ¦
¦ car3 ¦ ¦
+----------+------------+
Есть ли простой способ получить это?
У автомобиля не более одного моторного ребенка.
Внешнее соединение с видом на компоненты двигателя дает две строки для car1
, и этого не должно быть:
CREATE VIEW comp_motor
AS
SELECT * FROM component
WHERE type='B';
SELECT parent.name, child.name
FROM component parent
LEFT JOIN assembly a ON parent.id = a.parent.id
LEFT JOIN comp_motor child ON a.child_id = child.id
WHERE
parent.type = 'A';
Это дает
+------+--------+
¦ name ¦ name ¦
+------+--------+
¦ car1 ¦ motor1 ¦
¦ car1 ¦ NULL ¦
¦ car2 ¦ motor2 ¦
¦ car3 ¦ NULL ¦
+------+--------+
Второй ряд не должен быть там. Конечно, DISTINCT
не поможет в этом случае.
Я не могу изменить структуру базы данных.
Любой ввод будет приветствоваться!