私はテーブルassembly
によって記述されるcomponent
という単純な階層をMySQLに持っています。SQL - 階層内の子を一意に選択します(おそらく欠落)
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 ¦
+----+-----------+----------+
EDIT:正確に推測されるように、第3のエントリ(id = 3)は元の投稿にはありませんでした。テーブルが完成しました。
モーターの名前があれば、すべての車のリストを生成したいと思います。各車は一度現れなければならない。
所望の出力:
+----------+------------+
¦ car_name ¦ motor_name ¦
+----------+------------+
¦ car1 ¦ motor1 ¦
¦ car2 ¦ motor2 ¦
¦ car3 ¦ ¦
+----------+------------+
はこれを取得するための簡単な方法はありますか?
車には多くとも1人のモーターチャイルドがあります。
外側のモータ部品上のビューとの結合は、car1
ための2つの列を生成し、これは起こるべきではない。
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';
これにより、第2行があってはならない
+------+--------+
¦ name ¦ name ¦
+------+--------+
¦ car1 ¦ motor1 ¦
¦ car1 ¦ NULL ¦
¦ car2 ¦ motor2 ¦
¦ car3 ¦ NULL ¦
+------+--------+
を与えます。もちろん、DISTINCT
はこの場合には役立たないでしょう。
データベース構造を変更することはできません。
すべての入力が大歓迎です!
あなたが二行をしたくない場合は、内部結合使用する必要があります。 – Reddy