2012-01-16 3 views
1

私はテーブル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はこの場合には役立たないでしょう。

データベース構造を変更することはできません。

すべての入力が大歓迎です!

+0

あなたが二行をしたくない場合は、内部結合使用する必要があります。 – Reddy

答えて

2

次のSELECTステートメントを実行し、入手したものを教えてください。

SELECT * FROM component WHERE type = 'A' 

私はあなたが...二回そこに

EDIT

ああ、またはあなたは、アセンブリテーブルにCAR1ための2つのレコードを持っているがCar1を持っていると思いますか?これは何を示していますか?

SELECT * FROM assembly WHERE parent_id = 11 

それが元だ場合は、これを試してみてください...

SELECT 
    parent.name, 
    child.name 
FROM 
    component parent 
LEFT JOIN 
    (
    assembly a 
    INNER JOIN 
    comp_motor child 
     ON a.child_id = child.id 
) 
    ON parent.id = a.parent.id 
WHERE 
    parent.type = 'A'; 
+0

元の投稿の正確なエラーを指摘しました。ありがとうございます。私は今それを修正しました。 'assembly'テーブルにエントリがありませんでした。あなたのソリューションは、私が探していたものを正確に提供します。 – Adrien

+0

@Dems +1よく見られる! –

0

試してみてください。

select car.name car_name, coalesce(motor.name, 'No motor') motor_name 
from component car 
left join (select a.parent_id, c.name 
      from assembly a 
      inner join component c 
        on a.child_id = c.id and c.type = 'B') motor 
     on car.id = motor.parent_id 
where car.type = 'A' 
+0

あなたのソリューションも非常にうまく動作します。どうもありがとう。 – Adrien

関連する問題