2017-07-18 7 views
0

として同じ行を選択:私は確認することはできませんのMySQL:3つのテーブルを結合し、私は次のようにのようなもので3つのテーブルを結合する別名

SELECT a.id 
FROM tableA AS a 
LEFT JOIN tableB AS b ON a.id = b.id 
LEFT JOIN tableC AS c ON a.id = c.id 
WHERE 
b.name = c.name OR b.name IS NULL OR c.name IS NULL; 

、そのテーブルbまたはcがあります結合する行がある場合、名前列は同一でなければなりません。

私の質問は:この名前の列を選択したいが、一度だけ選択したい。したがって、bとcに参加する行がある場合は、どちらかから名前が必要です。参加する行が1つしかない場合は、その行の名前が必要です。 結果の列名は、それぞれ同一である必要があります。

表例

にtableA

id 
---- 
    1 
    2 
    3 
    4 

TABLEB

id | name 
----|------ 
    2 | X 
    3 | Y 

表C

id | name 
----|------ 
    2 | Q 
    3 | Y 
    4 | Z 

所望の結果:

id | name 
----|------ 
    1 | (NULL) 
    2 | X  (name is from tableB) 
    2 | Q  (name is from tableC) 
    3 | Y  (name is from tableB or tableC) 
    4 | Z  (name is from tableC) 
+0

を削除TABLEBが二回言及されています。 – Strawberry

+0

ありがとう、私はそれを訂正しました – jacksbox

答えて

0
SELECT a.id, IFNULL(b.name, c.name) 
FROM tableA AS a 
LEFT JOIN tableB AS b ON a.id = b.id 
LEFT JOIN tableC AS c ON a.id = c.id 
WHERE 
b.name = c.name OR b.name IS NULL OR c.name IS NULL; 

このクエリでは、あなたが欲しいものを返す必要があります。 IFNULL(X, Y)は、Xがnullであると言って動作し、Yを使用します。例では、b.nameがnullでない場合、b.nameが表示されます。 b.nameがnullの場合、c.nameが表示されます。 c.nameに何かがある場合、名前が表示されますが、c.nameがヌルの場合は、NULLが必要に応じて表示されます。必要でない場合、私はこれがあなたに

SELECT 
    a.id, 
    (CASE COALESCE(b.`name`, '') WHEN '' THEN c.`name` ELSE b.`name` END) AS name2, 
    b.`name` AS B, 
    c.`name` AS C 
FROM foo1 AS a 
LEFT JOIN foo2 AS b ON (a.id = b.id) 
LEFT JOIN foo3 AS c ON (a.id = c.id) 
ORDER BY a.id; 
+0

はい - あなたの声明は正しいです。私はそのコメントを撤回する。 ;-) – Strawberry

+0

可能な限り、異なる名前を持つ複数の同一IDがあり、これは名前に一致する必要があるwhereステートメントが必要です – jacksbox

+0

名前が異なる複数の同一IDが "..しかし、どちらにも参加する行がある場合、名前列は同じでなければなりません。私は理解していないかもしれないので、あなたの質問に現れるこの例または参照の例が参考になります。 – yanman1234

0

は、全くLEFTを取り除くために最善でしょう。

SELECT a.id, b.name 
FROM tableA AS a 
LEFT JOIN tableB AS b ON a.id = b.id 
UNION 
SELECT a.id, c.name 
FROM tableA AS a 
LEFT JOIN tableC AS c ON a.id = c.id 

名前がNULLの行をしたくない場合は、LEFT

0

もう一つの可能​​性に役立つことを願っています

関連する問題