web-dev-qa-db-ja.com

使用可能な行がある場合にのみINNER JOINを適用します。それ以外の場合はNULLを使用します

+----+-----------+-----------+-------------+----------+
| id | value_id  | parent_id | dropdown_id | name     |
+----+-----------+-----------+-------------+----------+
|  7 | 14945     |  14944    |         57  |4000      |
|  8 | 14944     |  0        |         56  |bbb       |
|  9 | 14943     |  14940    |         59  |comprable |
| 10 | 14942     |  14939    |         59  |comprable |
| 11 | 14940     |  14931    |         58  |3         |
| 12 | 14939     |  14930    |         58  |2         |
| 13 | 14931     |  14929    |         57  |5000      |
| 14 | 14930     |  14928    |         57  |4000      |
| 15 | 14929     |  0        |         56  |rrr       |
| 16 | 14928     |  0        |         56  |ttt       |
+----+-----------+-----------+-------------+----------+

上記の表にデータがあります。以下のクエリを使用して、テーブルからデータを取得します。

SELECT `d0`.`name` AS `name0`, `d1`.`name` AS `name1`, `d2`.`name` AS `name2`, `d3`.`name` AS `name3` FROM `my_table_1` AS `d0`
 INNER JOIN `my_table_1` AS `d1` ON d1.parent_id = d0.value_id
 INNER JOIN `my_table_1` AS `d2` ON d2.parent_id = d1.value_id
 INNER JOIN `my_table_1` AS `d3` ON d3.parent_id = d2.value_id
 WHERE (d0.dropdown_id=56)

ここでは、内部結合を使用してvalue_idparent_idから取得しています。

基本的に、現在のレコードに使用できる親があるかどうかを確認し、存在する場合はそのデータを取得します。レコードの親の数がINNER JOINの数と同じ場合、正しいデータを取得できます

上記のクエリと同様に、私は次のような詳細を取得します

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+

ここで私はテーブルの下に行きたいです

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+

ここの最後の行には、d2テーブルとd3テーブルがありません。そのデータもNULLの値に含めたいです。

どんな助けでもありがたいです。

2
Jaimin Sutariya

内部結合を左結合に置き換えると、必要なデータが得られます。左側の結合は、反対側に一致がない場合でも結果を示し、その場合はnullを示します。

SELECT `d0`.`name` AS `name0`, `d1`.`name` AS `name1`, `d2`.`name` AS 
       `name2`, `d3`.`name` AS `name3` FROM `my_table_1` AS `d0`
 LEFT JOIN `my_table_1` AS `d1` ON d1.parent_id = d0.value_id
 LEFT JOIN `my_table_1` AS `d2` ON d2.parent_id = d1.value_id
 LEFT JOIN `my_table_1` AS `d3` ON d3.parent_id = d2.value_id
 WHERE (d0.dropdown_id=56)
9
Joe W

左結合を使用する理由は次のとおりです。

結合の基本

Inner Joinは、左と右の両方のテーブルから一致する行のみを提供します。

左結合は、左のテーブルのすべてのレコードと右のテーブルの一致するレコードを返します。つまり、右側のテーブルに一致するものがない場合、右側のテーブル列の代わりにNULLが表示されます。

右結合は、左テーブルと右テーブルで同じですが、逆の動作をします。

次に、完全外部結合と相互結合がありますが、質問に適用されないため、それらを調べることができます。

4
beastmaster283